7

नहीं मिला मैं जानता हूँ कि इस विषय में कई स्थानों पर चर्चा की है, लेकिन उसके बाद मैं लगभग सभी उनमें से माध्यम से चला गया, मैं अपनी पहली StackOverflow सवाल बनाने का फैसला किया है ...एंड्रॉयड स्वयं हस्ताक्षरित प्रमाणपत्र: प्रमाणीकरण पथ के लिए ट्रस्ट लंगर

मैं एक सुरक्षित वेब सेवा (https) कि किसी प्रमाणपत्र का उपयोग पहुंच को प्रतिबंधित करने से कनेक्ट करना चाहते है, और एक उपयोगकर्ता नाम/पासवर्ड उपयोगकर्ता को प्रमाणित करने के लिए:

समस्या निम्नलिखित है। तो मेरे पास एक क्लाइंट प्रमाणपत्र (पी 12 फ़ाइल) और एक सर्वर प्रमाण (पेम या डर फ़ाइल) है। मैं HttpURLConnection क्लास का उपयोग करने का प्रयास करता हूं, क्योंकि मैंने जो सुना है, उससे अपाचे लाइब्रेरी को एंड्रॉइड पर और समर्थित नहीं किया जाएगा।

 // Load CAs from our reference to the file 
     CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
     InputStream caInput = new BufferedInputStream(new FileInputStream(serverCert)); 
     X509Certificate serverCertificate; 

     try { 
      serverCertificate = (X509Certificate)cf.generateCertificate(caInput); 
      System.out.println("ca=" + serverCertificate.getSubjectDN()); 
     } finally { 
      caInput.close(); 
     } 
     Log.d(TAG, "Server Cert: " + serverCertificate); 

     // Create a KeyStore containing our trusted CAs 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null); 
     trustStore.setCertificateEntry("my ca", serverCertificate); 

     //Load the Client certificate in the keystore 
     KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
     FileInputStream fis = new FileInputStream(clientCert); 
     keyStore.load(fis,CLIENT_PASSWORD); 

     // Create a TrustManager that trusts the CAs in our KeyStore 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     tmf.init(trustStore); 

     //Build the SSL Context 
     KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     kmf.init(keyStore, pref.getString(Constants.clientCertificatePassword, "").toCharArray 

()); 


    //Create the SSL context 
       SSLContext sslContext = SSLContext.getInstance("TLS"); 
       sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
... 
    //And later, we use that sslContext to initiatize the socketFactory 

       urlConnection = (HttpsURLConnection) requestedUrl.openConnection(); 
     urlConnection.setSSLSocketFactory(CertificateManager.getInstance().getSslContext().getSocketFactory()); 
... 

तो मैं अपने SSLContext बना सकते हैं, और मेरे दो प्रमाण पत्र सामग्री प्रदर्शित:

तो यह मेरी कार्यान्वयन (serverCert और clientCert मेरी फ़ाइलों का पूरा पथ कर रहे हैं) है। लेकिन जब मैं अपने एचटीटीपीएस कनेक्शन को निष्पादित करने का प्रयास करता हूं, तो मुझे निम्न अपवाद मिलता है:

09-23 13: 43: 30.283: डब्ल्यू/सिस्टम.एर (1 9 422): javax.net.ssl.SSLHandshakeException: java.security। cert.CertPathValidatorException: प्रमाणीकरण पथ के लिए ट्रस्ट एंकर नहीं मिला।

क्या आप में से कोई भी निम्न त्रुटि से मिला है? आपका समाधान क्या था?

http://blog.chariotsolutions.com/2013/01/https-with-client-certificates-on.html

http://nelenkov.blogspot.ch/2011/12/using-custom-certificate-trust-store-on.html

+0

मैंने इस समाधान को भी आजमाया (http://nelenkov.blogspot.ch/2011/12/using-custom-certificate-trust-store-on.html), लेकिन फिर भी वही संदेश ... क्या यह संभव है सर्वर अच्छी तरह से कॉन्फ़िगर नहीं है? – TheOnlyYam

+2

अरे, यह काफी समय है, लेकिन क्या आपको कोई समाधान मिला? मुझे एक ही समस्या है। मेरे पास एक पेम और पी 12 फाइल है। – Wicked161089

उत्तर

1

अपने कोड में अपने पैदा कर रहे हैं और एक SSLContext आरंभ लेकिन इसे प्रयोग नहीं:

इन वेबसाइट मैं माध्यम से चला गया (सफलता के बिना) कर रहे हैं। हो सकता है आप बदलना चाहिए:

urlConnection.setSSLSocketFactory(CertificateManager.getInstance().getSslContext().getSocketFactory()); 

द्वारा

urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); 

मैं आपको यह भी संभव हो तो JVM करने का विकल्प -Djavax.net.debug=all पारित करने के लिए सुझाव देते हैं। यह मानक आउटपुट पर एसएसएल कनेक्शन और हैंडशेक के बारे में विस्तृत जानकारी प्रिंट करेगा।

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