मैं जावा 6 का उपयोग कर रहा हूं और HttpsURLConnection
क्लाइंट सर्टिफिकेट का उपयोग कर रिमोट सर्वर के खिलाफ बनाने की कोशिश कर रहा हूं ।
सर्वर स्व-निर्दिष्ट रूट प्रमाणपत्र का उपयोग कर रहा है, और इसके लिए पासवर्ड-संरक्षित क्लाइंट प्रमाणपत्र प्रस्तुत करना पड़ता है। मैंने सर्वर रूट सर्टिफिकेट और क्लाइंट सर्टिफिकेट को डिफॉल्ट जावा कीस्टोर में जोड़ा है जो मुझे /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5) में मिला है । कीस्टोर फ़ाइल का नाम ऐसा प्रतीत होता है कि ग्राहक प्रमाणपत्र को वहां नहीं जाना है?
वैसे भी, इस स्टोर में रूट सर्टिफिकेट को जोड़ने से कुख्यात हल हो गया javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
हालाँकि, मैं अब इस बात पर अड़ा हुआ हूं कि क्लाइंट सर्टिफिकेट का उपयोग कैसे किया जाए। मैं दो तरीकों की कोशिश की है और न ही मुझे कहीं भी मिलता है।
सबसे पहले, और पसंदीदा, कोशिश करें:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
मैंने HttpsURLConnection वर्ग को छोड़ देने की कोशिश की है (आदर्श नहीं है क्योंकि मैं सर्वर से HTTP बात करना चाहता हूं), और इसके बजाय यह करें:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
मुझे यह भी पक्का नहीं है कि क्लाइंट सर्टिफिकेट यहां की समस्या है।