2009-07-24 22 views
42

मेरे पास एक अपाचे टॉमकैट 6.x सर्वर है जो एक स्व-हस्ताक्षरित SSL प्रमाणपत्र के साथ चल रहा है। मैं चाहता हूं कि क्लाइंट सर्वर पर अपना प्रमाणपत्र प्रस्तुत करे ताकि मैं उन्हें उपयोगकर्ताओं के डेटाबेस के आधार पर प्रमाणित कर सकूं। मेरे पास यह सब एक उदाहरण है जो मैंने ऑनलाइन पाया है, लेकिन उदाहरण कैन्ड प्रमाण पत्र और प्री-बिल्ड जेकेएस डाटास्टोर के साथ आया था। मैं अपना खुद का डेटास्टोर अपने स्वयं के कर्ट के साथ बनाना चाहता हूं लेकिन मुझे कोई भाग्य नहीं है।टोमकैट सर्वर/क्लाइंट सेल्फ-सिग्नल एसएसएल प्रमाणपत्र

मैं टोमकैट के लिए डेटास्टोर कैसे बना सकता हूं?
मैं टोमकैट के लिए एक स्व-हस्ताक्षरित प्रमाणपत्र कैसे बना सकता हूं?

मैं ग्राहक के लिए एक स्व-हस्ताक्षरित प्रमाणपत्र कैसे बना सकता हूं?
मैं क्लाइंट के हस्ताक्षर पर भरोसा करने के लिए टॉमकैट को कैसे मजबूर करूं?

मैं कई घंटे के लिए जावा कीटोल के साथ खेल रहा हूं।

उत्तर

59

अंत में मेरी समस्या का हल हो गया, इसलिए अगर कोई और अटक जाए तो मैं यहां परिणाम पोस्ट करूंगा।

Keytool डिफ़ॉल्ट रूप से जब स्व-हस्ताक्षरित प्रमाणपत्र पैदा DSA एल्गोरिथ्म का उपयोग करता:

माइकल मार्टिन के लिए धन्यवाद Michael's Software Thoughts & Ramblings की मुझे लगता है कि खोज की। फ़ायरफ़ॉक्स के पहले संस्करणों ने समस्या के बिना इन चाबियों को स्वीकार कर लिया। फ़ायरफ़ॉक्स 3 बीटा 5 के साथ, का उपयोग कर डीएसए काम नहीं करता है, लेकिन आरएसए का उपयोग करता है। उत्पन्न करते समय "-keyalg आरएसए" पास करना स्व-हस्ताक्षरित प्रमाणपत्र प्रमाण पत्र बनाता है फ़ायरफ़ॉक्स 3 बीटा 5 पूरी तरह से स्वीकार करता है।

मैंने बस उस ध्वज को सेट किया, फ़ायरफ़ॉक्स में सभी कैश साफ़ कर दिए और यह एक आकर्षण की तरह काम करता था! मैं इसे अपने प्रोजेक्ट के लिए टेस्ट-सेटअप के रूप में उपयोग कर रहा हूं और मुझे इसे अन्य लोगों के साथ साझा करने की ज़रूरत है, इसलिए मैंने एक छोटी बैच स्क्रिप्ट लिखी जो दो एसएसएल प्रमाणपत्र बनाता है। किसी को टॉमकैट सेटअप में गिराया जा सकता है और दूसरा एक .p12 फ़ाइल है जिसे फ़ायरफ़ॉक्स/आईई में आयात किया जा सकता है। धन्यवाद!

उपयोग: पहला कमांड लाइन तर्क क्लाइंट का उपयोगकर्ता नाम है। सभी पासवर्ड "पासवर्ड" हैं (बिना उद्धरण के)। अपनी जरूरतों को पूरा करने के लिए किसी भी हार्ड-कोडित बिट्स को बदलें।

@echo off 
if "%1" == "" goto usage 

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password 
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password 
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password 
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password 
keytool -list -v -keystore server.jks -storepass password 
del %1.cer 
goto end 

:usage 
echo Need user id as first argument: generate_keystore [username] 
goto end 

:end 
pause 

परिणाम दो फाइलें हैं। जिसे server.jks कहा जाता है जिसे आप टॉमकैट में छोड़ देते हैं और {username} .p12 नामक दूसरी फ़ाइल जिसे आप अपने ब्राउज़र में आयात करते हैं। Server.jks फ़ाइल में विश्वसनीय प्रमाणपत्र के रूप में क्लाइंट प्रमाणपत्र जोड़ा गया है।

मुझे आशा है कि किसी और को यह उपयोगी लगेगा।

और यहाँ है एक्सएमएल अपने बिलाव conf/sever.xml फ़ाइल (केवल बिलाव 6.x पर पर परीक्षण)

<Connector 
    clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75" 
    enableLookups="true" disableUploadTimeout="true" 
    acceptCount="100" maxThreads="200" 
    scheme="https" secure="true" SSLEnabled="true" 
    keystoreFile="${catalina.home}/conf/server.jks" 
    keystoreType="JKS" keystorePass="password" 
    truststoreFile="${catalina.home}/conf/server.jks" 
    truststoreType="JKS" truststorePass="password" 
    SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS" 
/> 

बिलाव 7 के लिए करने के लिए जोड़ा जाना चाहिए:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
      port="8443" SSLEnabled="true" 
      maxThreads="200" scheme="https" secure="true" 
      keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password" 
      clientAuth="false" sslProtocol="TLS" />  
+1

इस के लिए बहुत बहुत धन्यवाद! मैं पूरे दिन विभिन्न "ट्यूटोरियल्स" के साथ घूम रहा हूं और यह पहला ऐसा है जो वास्तव में क्लाइंटऑथ = "सत्य के साथ काम करता है " –

+0

यह एक सुंदर जवाब है। मैंने बल्ले फ़ाइल के साथ बहुत समय बचाया है। और सबसे अच्छा यह है कि यह पूरी तरह से काम करता है। – Yster

2

बनाएं प्रमाण पत्र:

<Connector port="8443" maxHttpHeaderSize="8192" 
     maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
     enableLookups="false" disableUploadTimeout="true" 
     acceptCount="100" scheme="https" secure="true" 
     keystoreFile="/home/bob/mykeystore" 
     clientAuth="false" sslProtocol="TLS" /> 
:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore 

स्वयं हस्ताक्षरित प्रमाणपत्र आप तो जरूरत एसएसएल कनेक्टर पर बिलाव के server.xml संपादित और कीस्टोर गुण निर्दिष्ट, जैसे के लिए सभी डेटा दर्ज करें

या बिलाव डॉक्स का पालन करें ...

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

+3

मुझे लगता है कि पहले देखा था और यह मेरे आधा मेरा उत्तर मिल गया है, लेकिन आप भूल रहे हैं ट्रिकियर हिस्सा। मैं स्वयं हस्ताक्षरित क्लाइंट certs का उपयोग कैसे करूं ?? आपके द्वारा प्रदान किए गए उदाहरण में, यह "clientAuth = 'false' कहता है।" 'सत्य' पर सेट होने पर मुझे इसे काम करने की ज़रूरत है। "यदि आप चाहते हैं कि इस एससेट का उपयोग करने के लिए टॉमकैट को सभी एसएसएल क्लाइंट क्लाइंट सर्टिफिकेट पेश करने की आवश्यकता हो।" यही वही है जो मैं चाहता हूं। मैं सर्वर को स्वयं के हस्ताक्षरित प्रमाण पत्र को स्वीकार करने के लिए नहीं मिल सकता। – davidemm

3

क्लाइंट प्रमाणीकरण को सक्षम करने के लिए, आपको टॉमकैट के लिए "ट्रस्ट स्टोर" निर्दिष्ट करने की आवश्यकता है: रूट प्रमाणन प्राधिकरणों से प्रमाण पत्र वाले एक प्रमुख स्टोर में, जिसे आप "ट्रस्ट एंटर्री" के रूप में चिह्नित करते हैं।

यह Connector तत्व की विशेषताओं द्वारा निर्दिष्ट किया जाता है: truststoreFile, truststorePass (जो keystorePass के मूल्य के चूक), और truststoreType (जो "JKS" डिफ़ॉल्ट रूप से)।

यदि कोई ग्राहक स्वयं हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहा है, तो इसका "रूट" सीए प्रमाण पत्र स्वयं ही है; इसके बाद, आपको क्लाइंट के स्वयं-हस्ताक्षरित प्रमाणपत्र को टॉमकैट के ट्रस्ट स्टोर में आयात करने की आवश्यकता है।

यदि आपके पास कई ग्राहक हैं, तो यह जल्दी से परेशानी बन जाएगा। उस स्थिति में, आप अपने ग्राहकों के लिए प्रमाणपत्र हस्ताक्षर करना चाहते हैं। जावा keytool कमांड ऐसा नहीं कर सकता है, लेकिन सभी आवश्यक कमांड लाइन सुविधाएं ओपनएसएसएल में उपलब्ध हैं। या आप बड़े पैमाने पर EJBCA जैसे कुछ देख सकते हैं।

अभी तक बेहतर है, अपने ग्राहकों से मौजूदा मुक्त सीए का उपयोग करने के लिए कहें, जैसे startcom.org। यह हमेशा सर्वर प्रमाणपत्रों के लिए काम नहीं करता है, क्योंकि स्टार्टकॉम का प्रमाणपत्र सभी ब्राउज़रों में शामिल नहीं है, लेकिन इस स्थिति को उलट दिया गया है, और स्टार्टकॉम रूट प्रमाणपत्र आसानी से टॉमकैट ट्रस्ट स्टोर में आयात किया जा सकता है।

1

पिछले उत्तरों मेरे लिए उपयोगी हैं, लेकिन एक खोल उपकरण संस्करण नहीं है। तो मैंने एक लिखा था।

key_gen.sh:

#! /bin/bash 
# a key generator for https, 

basename=server 
key_algorithm=RSA 
password_key=123456 
password_store=123456 
country=US 

# clean - pre 
rm "${basename}.jks" 

# generate server side 
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store 

tomcat8 के लिए, server.xml के लिए निम्न config जोड़ सकते हैं:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
     maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
     clientAuth="false" sslProtocol="TLS" 
     acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456" 
    /> 
संबंधित मुद्दे