나는 액세스를 제한하기 위해 인증서를 사용하여 보안 웹 서비스 (HTTPS)에 연결하려면, 사용자를 인증 할 수있는 사용자 이름/암호 :
문제는 다음이다. 그래서 나는 클라이언트 인증서 (p12 파일) 및 서버 인증서 (pem 또는 der 파일) 있습니다. HttpURLConnection 클래스를 사용하려고합니다. 왜냐하면 내가 들었으므로 Apache 라이브러리가 Android에서 더 이상 지원되지 않기 때문입니다.
// 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 내 파일의 전체 경로입니다)입니다. 그러나 HTTPS 연결을 실행하려고하면 다음 예외가 발생합니다.
09-23 13 : 43 : 30.283 : W/System.err (19422) : 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
나는이 솔루션 (http://nelenkov.blogspot.ch/2011/12/using-custom-certificate-trust-store-on.html)도 시도했지만 여전히 같은 메시지가 ... 가능합니까? 서버가 제대로 구성되지 않았습니까? – TheOnlyYam
이봐 요, 꽤 오래되었지만 해결책을 찾았습니까? 나는 같은 문제가있다. 나는 pem과 p12 파일을 가지고있다. – Wicked161089