7

를 찾을 수 없습니다안드로이드 자체 서명 인증서 : 인증 경로에 대한 신뢰 앵커 ... 나는이 주제는 여러 곳에서 논의 알고 있지만, 나는 거의 모두를 통해 간 후에, 나는 나의 첫번째 StackOverflow의 질문을 만들하기로 결정했습니다

나는 액세스를 제한하기 위해 인증서를 사용하여 보안 웹 서비스 (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

+0

나는이 솔루션 (http://nelenkov.blogspot.ch/2011/12/using-custom-certificate-trust-store-on.html)도 시도했지만 여전히 같은 메시지가 ... 가능합니까? 서버가 제대로 구성되지 않았습니까? – TheOnlyYam

+2

이봐 요, 꽤 오래되었지만 해결책을 찾았습니까? 나는 같은 문제가있다. 나는 pem과 p12 파일을 가지고있다. – Wicked161089

답변

1

당신이 작성하고 SSLContext을 초기화하지만 그것을 사용하지 않는 :

이들은 내가 (성공없이)을 통해 갔다 웹 사이트입니다. 어쩌면 당신은 대체해야합니다

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

urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); 

에 의해 나는 또한 가능한 경우가 JVM에 옵션 -Djavax.net.debug=all을 통과하는 것이 좋습니다. 표준 출력에서 ​​SSL 연결 및 핸드 셰이크에 대한 자세한 정보를 인쇄합니다.