android studio HttpURLConnection 出现握手失败

最近发现在做https请求时,会报出SSL握手异常

[plain]  view plain  copy
  1. javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.  

仔细看了下,用HttpUrlConnection做https请求,应该是没有信任所有证书,导致请求失败的。

上网学习了一下,发现需要实现X509TrustManager接口创建一个证书,然后使用我们自己创建的信任管理器初始化SSLContext 对象。

[java]  view plain  copy
  1. /** 
  2.      * Trust every server - dont check for any certificate 
  3.      */  
  4.     private static void trustAllHosts() {  
  5.         // Create a trust manager that does not validate certificate chains  
  6.         TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {  
  7.             public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
  8.                 return new java.security.cert.X509Certificate[] {};  
  9.             }  
  10.             public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
  11.                 Log.i("skyapp""checkClientTrusted");  
  12.             }  
  13.             public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
  14.                 Log.i("skyapp""checkServerTrusted");  
  15.             }  
  16.         } };  
  17.         // Install the all-trusting trust manager  
  18.         try {  
  19.             SSLContext sc = SSLContext.getInstance("TLS");  
  20.             sc.init(null, trustAllCerts, new java.security.SecureRandom());  
  21.             HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  

在我们HttpURLConnection调用openConnection之前,执行一下trustAllHosts方法,信任所有证书,即可正常进行https请求。


以上是HttpURLConnection类证书信任问题导致的https请求异常解决方案,而如果用到HttpClient的话,则需要另外的解决方法。

在HttpClient执行excute之前,执行以下语句即可

[java]  view plain  copy
  1. SSLSocketFactory.getSocketFactory().setHostnameVerifier(new AllowAllHostnameVerifier());  
posted @ 2017-10-20 17:54  Mr.zzz  阅读(72)  评论(0编辑  收藏  举报