SSL握手异常,同时通过https连接使用Android中的自签名证书Nougat

问题描述:

在我的android应用程序中,我通过https连接。我正在使用自签名证书进行连接。 它正在以下API级别24(机器人牛轧糖之前),但在Android牛轧糖,它抛出的SSL握手异常设备:SSL握手异常,同时通过https连接使用Android中的自签名证书Nougat

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> 

请帮我解决这个问题。

我得到它通过添加自定义信任管理器的工作时间 重新启动服务器。初始化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; 
       } 
      }; 

我使用服务器证书验证证书。现在它的工作。

System.setProperty(“javax.net.ssl.trustStore”,newKeystoreFile.getAbsolutePath());

simliarly,尝试设置keystorepassword和keypassword酒店每天当你试图使用上述房产 https://docs.oracle.com/cd/E17802_01/webservices/webservices/reference/tutorials/wsit/doc/WSIT_Security6.html