2010-12-12 24 views
18

मैं जावा क्लाइंट/सर्वर एप्लिकेशन से कनेक्शन सुरक्षित करने की कोशिश कर रहा हूं जो इंटरनेट पर संचार करता है। मेरा विचार स्वयं हस्ताक्षरित प्रमाणपत्र और क्लाइंट प्रमाणीकरण के साथ एसएसएल सॉकेट का उपयोग करना था। मैंने निम्नलिखित किया:जावा: एसएसएल क्लाइंटसाइड प्रमाणीकरण स्व-हस्ताक्षरित प्रमाणपत्र

  • सर्वर: कीस्टोर में नए स्व-हस्ताक्षरित प्रमाणपत्र शामिल हैं। keytool -genkey -kelalg RSA ...
  • ग्राहक: कीस्टोर में नए स्व-हस्ताक्षरित प्रमाणपत्र शामिल हैं। keytool -genkey -kelalg RSA ...
  • सर्वर: ट्रस्टस्टोर निर्यातित क्लाइंट प्रमाणपत्र (ऊपर बुलेट बिंदु से) युक्त ट्रस्टस्टोर। keytool -export क्लाइंट सर्टिफिकेट निर्यात करने के लिए और keytool -import -v -trustcacerts सर्वर के ट्रस्टस्टोर
  • क्लाइंट: ट्रस्टस्टोर में निर्यात किए गए सर्वर प्रमाणपत्र (पहले बुलेट बिंदु से) को आयात करने के लिए निर्यात करने के लिए। keytool -export ग्राहक की truststore

ट्रस्ट और keystores सर्वर/ग्राहक के लिए सही ढंग से जुड़े होते हैं में आयात करने के सर्वर प्रमाणपत्र और keytool -import -v -trustcacerts निर्यात करने के लिए। मैं प्रमाण पत्र लोड हो रहा हूं (एसएसएल डीबग जानकारी)। लेकिन पूरी बात काम नहीं करती है। एसएसएल हाथ मिलाना के दौरान, मैं निम्न त्रुटि (एसएसएल डिबग जानकारी) प्राप्त करें:

main, WRITE: TLSv1 Handshake, length = 897 
main, READ: TLSv1 Handshake, length = 141 
*** Certificate chain 
*** 
main, SEND TLSv1 ALERT: fatal, description = bad_certificate 
main, WRITE: TLSv1 Alert, length = 2 
main, called closeSocket() 
main, handling exception: javax.net.ssl.SSLHandshakeException: null cert chain 
main, IOException in getSession(): javax.net.ssl.SSLHandshakeException: null cert chain 
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
    at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificateChain(Unknown Source) 
    at sslsocket.Server.getClientDistinguishedName(Server.java:86) 
    at sslsocket.Server.main(Server.java:37) 

जब मैं ग्राहक के पक्ष प्रमाणीकरण को अक्षम, यह दोषरहित काम करता है।

मैं वास्तव में कुछ मदद की सराहना करता हूं। आपका बहुत बहुत धन्यवाद!

Initializing SSL 
*** 
found key for : server 
chain [0] = [ 
[ 
    Version: V3 
    Subject: CN=xxxxxx Server, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH 
    Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5 

    Key: Sun RSA public key, 1024 bits 
    modulus: 9487726xxxxxx15617628447913191 
    public exponent: 65537 
    Validity: [From: Thu Dec 09 17:04:05 CET 2010, 
       To: Wed Jul 03 18:04:05 CEST 2109] 
    Issuer: CN=xxxxxx Server, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH 
    SerialNumber: [ 4dxxxxxx5] 

] 
    Algorithm: [SHA1withRSA] 
    Signature: 
0000: 6F 06 1D EA E9 DC 5B 5D EC EB 33 D4 47 01 94 1A o.....[]..3.G... 
xxxxxx 
0070: 99 78 C4 31 5F 84 8F 7B C1 2F 10 A1 9F 50 72 A1 .x.1_..../...Pr. 

] 
*** 
adding as trusted cert: 
    Subject: CN=xxxxxx Client, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH 
    Issuer: CN=xxxxxx Client, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH 
    Algorithm: RSA; Serial number: 0x4xxxxxx0 
    Valid from Thu Dec 09 17:06:56 CET 2010 until Wed Jul 03 18:06:56 CEST 2109 

trigger seeding of SecureRandom 
done seeding SecureRandom 
Opening socket 
Waiting for clients... 
Allow unsafe renegotiation: false 
Allow legacy hello messages: true 
Is initial handshake: true 
Is secure renegotiation: false 
matching alias: server 
main, called closeSocket() 
Allow unsafe renegotiation: false 
Allow legacy hello messages: true 
Is initial handshake: true 
Is secure renegotiation: false 
[read] MD5 and SHA1 hashes: len = 3 
0000: 01 03 01           ... 
[read] MD5 and SHA1 hashes: len = 98 
0000: 00 3C 00 00 00 20 00 00 04 01 00 80 00 00 05 00 .<... .......... 
xxxxxx 
0060: 26 51            &Q 
main, READ: SSL v2, contentType = Handshake, translated length = 75 
*** ClientHello, TLSv1 
RandomCookie: GMT: 1292088238 bytes = { 223,xxxxxx, 81 } 
Session ID: {} 
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 
Compression Methods: { 0 } 
*** 
%% Created: [Session-1, SSL_RSA_WITH_RC4_128_MD5] 
*** ServerHello, TLSv1 
RandomCookie: GMT: 1292088238 bytes = { 222,xxxxxx, 241 } 
Session ID: {77,xxxxxx, 235} 
Cipher Suite: SSL_RSA_WITH_RC4_128_MD5 
Compression Method: 0 
Extension renegotiation_info, renegotiated_connection: <empty> 
*** 
Cipher suite: SSL_RSA_WITH_RC4_128_MD5 
*** Certificate chain 
chain [0] = [ 
[ 
    Version: V3 
    Subject: CN=xxxxxx Server, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH 
    Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5 

    Key: Sun RSA public key, 1024 bits 
    modulus: 948772xxxxxx17628447913191 
    public exponent: 65537 
    Validity: [From: Thu Dec 09 17:04:05 CET 2010, 
       To: Wed Jul 03 18:04:05 CEST 2109] 
    Issuer: CN=xxxxxx Server, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH 
    SerialNumber: [ 4d00fdf5] 

] 
    Algorithm: [SHA1withRSA] 
    Signature: 
0000: 6F 06 1D EA E9 DC 5B 5D EC EB 33 D4 47 01 94 1A o.....[]..3.G... 
xxxxxx 
0070: 99 78 C4 31 5F 84 8F 7B C1 2F 10 A1 9F 50 72 A1 .x.1_..../...Pr. 

] 
*** 
*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
<CN=xxxxxx Client, OU=communication, O=xxxxxx, L=Zuerich, ST=ZH, C=CH> 
*** ServerHelloDone 
[write] MD5 and SHA1 hashes: len = 897 
0000: 02 00 00 4D 03 01 4D 04 B4 AE DE E4 AF 62 FA 48 ...M..M......b.H 
0xxxxxx 
0380: 00             . 
main, WRITE: TLSv1 Handshake, length = 897 
main, READ: TLSv1 Handshake, length = 141 
*** Certificate chain 
*** 
main, SEND TLSv1 ALERT: fatal, description = bad_certificate 
main, WRITE: TLSv1 Alert, length = 2 
main, called closeSocket() 
main, handling exception: javax.net.ssl.SSLHandshakeException: null cert chain 
main, IOException in getSession(): javax.net.ssl.SSLHandshakeException: null cert chain 
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
    at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificateChain(Unknown Source) 
    at sslsocket.Server.getClientDistinguishedName(Server.java:86) 
    at sslsocket.Server.main(Server.java:37) 
+0

क्या होता है यदि आप ग्राहक के स्वयं-हस्ताक्षरित प्रमाण पत्र को अपने ट्रस्टस्टोर में जोड़ते हैं? –

+0

कोई फर्क नहीं पड़ता। मुझे अब भी वही त्रुटि मिलती है। – Chris

+0

यह मेरे लिए काम करता है अगर मेरे सर्वर ट्रस्टस्टोर में क्लाइंट प्रमाणपत्र है और मेरे क्लाइंट ट्रस्टस्टोर में सर्वर प्रमाणपत्र है। –

उत्तर

14

पहले एसएसएल ट्रेस दूसरे से एक का हिस्सा प्रतीत होता है, सर्वर पर प्रदर्शित:

आप नीचे सर्वर से पूर्ण है, लेकिन उसकी गुमनाम उत्पादन पाते हैं। कृपया पुष्टि करें।

दूसरा ट्रेस दिखाता है कि सर्वर ने 'सीएन = xxxxxx क्लाइंट, ओयू = संचार, ओ = xxxxxx, एल = ज़्यूरिक, एसटी = जेडएच, सी = सीएच' और क्लाइंट द्वारा हस्ताक्षरित आरएसए या डीएसएस प्रमाण पत्र के लिए कहा एक खाली प्रमाणपत्र श्रृंखला भेजकर जवाब दिया। इसका मतलब केवल यह हो सकता है कि क्लाइंट के कीस्टोर में इस तरह का कोई प्रमाणपत्र नहीं है या क्लाइंट सही कीस्टोर का उपयोग नहीं कर रहा था।

+0

उस उत्तर के लिए धन्यवाद। मैंने क्लाइंट कीस्टोर को दोबारा जांच लिया, हालांकि मैंने सोचा कि मैंने पहले ही यह 100 बार किया है। वैसे भी, मैंने देखा कि कीस्टोर में केवल सार्वजनिक कुंजी थी, न कि ग्राहक के प्रमाण पत्र की निजी कुंजी। किसी भी तरह से मुझे गड़बड़ होनी चाहिए। – Chris

+0

यह सहायक था, यह स्पष्ट किया गया कि या तो सीए हस्ताक्षरित प्रमाण या निजी कुंजी या पूरे कीस्टोर को इस प्रक्रिया के लिए गायब होना चाहिए *** *** सर्टिफिकेट चेन' ... मेरे लिए समस्या यह थी कि ' SSLSocketFactory.getSocketFactory() 'ट्रस्टस्टोर सेट को स्वचालित रूप से '-Djavax.net.ssl.trustStore' द्वारा लोड करता है लेकिन यह स्वचालित रूप से' -Djavax.net.ssl.keyStore' द्वारा कीस्टोर सेट लोड नहीं करता है !! तो मुझे इसे स्पष्ट रूप से करना था: http://www.smartjava.org/content/client-certificates-httpclient-4 – pulkitsinghal

+2

केवल डिफ़ॉल्ट SSLContext javax.ney.ssl.keyStore का पालन करता है। जिन लोगों को आप getInstance() के साथ स्वयं बनाते हैं, किसी कारण से नहीं होते हैं। – EJP

संबंधित मुद्दे