7

Bu konunun pek çok yerde tartışıldığını biliyorum, ancak neredeyse hepsinden geçtikten sonra, ilk StackOverflow sorusunu oluşturmaya karar verdim ...Android kendinden imzalı sertifika: sertifika yolu için güvenilir bağlantı bulunamadı

Ben erişimi kısıtlamak için bir sertifika kullanmak güvenli webcoder (https) bağlanmak istediğiniz ve kullanıcının kimliğini doğrulamak için bir kullanıcı adı/şifre:

sorun şudur. Yani bir istemci sertifikam (p12 dosya) ve bir sunucu sertifikası (pem veya der dosya) var. HttpURLConnection sınıfını kullanmayı deniyorum, çünkü duyduğum kadarıyla Apache kütüphanesi artık Android'de desteklenmeyecek.

 // 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()); 
... 

Yani benim SSLContext'i oluşturmak ve benim iki sertifikaları içeriğini görüntüleyebilir:

Yani bu benim uygulamaları (serverCert ve clientCert dosyalarıma tam yolu vardır) 'dir. Ancak HTTPS bağlantımı çalıştırmayı denediğimde, aşağıdaki özel durumu elde ederim:

09-23 13: 43: 30.283: W/System.err (19422): javax.net.ssl.SSLHandshakeException: java.security. cert.CertPathValidatorException: Sertifika yolu için güvenilir bağlantı bulunamadı.

Biriniz aşağıdaki hatayla karşılaştınız mı? Çözümün neydi? Kodunuzda

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

Ayrıca bu çözümü denedim (http://nelenkov.blogspot.ch/2011/12/using-custom-certificate-trust-store-on.html), ama yine de aynı mesaj ... Bu mümkün mü? Sunucu iyi yapılandırılmamış mı? – TheOnlyYam

+2

Hey, epey bir zamandı, ama bir çözüm buldunuz mu? Aynı problemim var. Bir pem ve bir p12 dosyam var. – Wicked161089

cevap

1

senin yaratma ve SSLContext başlatılıyor ama kullanılmıyor:

Bunlar i (başarı olmadan) geçti web sitesi bulunmaktadır. Belki değiştirmeniz gerekir:

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

urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); 

tarafından Ben de mümkünse JVM seçeneği -Djavax.net.debug=all geçmek öneriyoruz. SSL bağlantısı ve el sıkışma hakkında ayrıntılı bilgileri standart çıktıya yazdıracaktır.