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
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
Hey, epey bir zamandı, ama bir çözüm buldunuz mu? Aynı problemim var. Bir pem ve bir p12 dosyam var. – Wicked161089