7

このトピックは多くの場所で議論されていますが、ほとんどすべてを調べた後、私は最初のStackOverflow質問を作成することにしました...Android自己署名証明書:証明書パスの信頼アンカーが見つかりません

私はアクセスを制限するために証明書を使用してセキュリティで保護されたWebサービス(HTTPS)に接続すると、ユーザを認証するためのユーザー名/パスワード:

問題は以下の通りです。だから私はクライアント証明書(p12ファイル)とサーバー証明書(pemまたはderファイル)があります。私はHttpURLConnectionクラスを使用しようとしています。私が聞いたことから、ApacheライブラリはAndroidでサポートされなくなるからです。

だからこれは私の実装(serverCertとCLIENTCERTが私のファイルへのフルパスです)です。

 // 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を作成し、私の2つの証明書の内容を表示することができます。しかし、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(sslContext.getSocketFactory()); 

によって

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

を私はまた、JVMにオプション-Djavax.net.debug=allを渡すことを提案します。 SSL接続とハンドシェイクに関する詳細情報が標準出力に出力されます。

関連する問題