1

私のAndroidアプリケーションでは、httpsで接続します。私は自己署名証明書を使って接続しています。 それがSSLハンドシェイク例外をスローアンドロイドヌガーに(アンドロイドヌガー前)APIレベル24 .But以下のデバイスに取り組んでいる:android Nougatの自己署名証明書を使用してhttpsで接続中のSSLハンドシェイク例外

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 認証パスのトラストアンカーが見つかりません。

これは私がHTTPS経由で接続する方法である: -

SSLContext context = null; 
    try 
    { 
     KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
     // Get the raw resource, which contains the keystore with 
     // your trusted certificates (root and any intermediate certs) 
     InputStream input = new BufferedInputStream(context.getAssets().open(pkcsFilename)); 
     try { 
      // Initialize the keystore with the provided trusted certificates 
      // Also provide the password of the keystore 
      keyStore.load(input, password.toCharArray()); 
     } finally { 
      input.close(); 
     } 

     KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyFactory.init(keyStore, "".toCharArray()); 

     // Load CAs from an InputStream 
     // (could be from a resource or ByteArrayInputStream or ...) 
     CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
     Certificate ca = null; 
     input = new BufferedInputStream(context.getAssets().open(certificateFilename)); 
     try 
     { 
      ca = cf.generateCertificate(input); 
     } 
     finally 
     { 
      input.close(); 
     } 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null, null); 
     trustStore.setCertificateEntry("server", ca); 

     // Create a TrustManager that trusts the CAs in our KeyStore 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     tmf.init(trustStore); 

     // Create an SSLContext that uses our TrustManager 
     context = SSLContext.getInstance("TLS"); 
     context.init(keyFactory.getKeyManagers(), tmf.getTrustManagers(), null); 

     HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 

私は、次のlinkを試してみました、しかし、それは助けにはなりません。

これは私のネットワーク設定ファイルです。 AndroidManifest.xmlファイルに追加しました。

<?xml version="1.0" encoding="utf-8"?> 
<network-security-config> 
    <domain-config> 
     <domain includeSubdomains="true">xyz.com</domain> 
     <trust-anchors> 
     <certificates src="@raw/root_ca" /> 
     </trust-anchors> 
    </domain-config> 
</network-security-config> 

これを解決する方法を教えてください。

答えて

0

を使用しようとしている時はいつでも私はそれがカスタム信頼マネージャーを追加することにより、作業しまったびにサーバーを再起動 設定してみてください。 SSLコンテキストcontext.init(keyFactory.getKeyManagers(), tmf.getTrustManagers(), null);

I modified it as : 

context.init(keyFactory.getKeyManagers(), new TrustManager[] { tm }, null); 
TrustManager tm = new X509TrustManager() { 
       public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
       } 

       public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
        for (int j=0; j<chain.length; j++) 
        { 
         chain[j].checkValidity(); 
         try { 
          chain[j].verify(ca.getPublicKey()); 
         } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException | 
           SignatureException e) { 
          e.printStackTrace(); 
          throw new CertificateException(e.getMessage()); 
         } 
        } 
       } 

       public X509Certificate[] getAcceptedIssuers() { 
        return null; 
       } 
      }; 

を初期化する間、私は、サーバー証明書と証明書を検証します。今はその仕事。

関連する問題