如何在Android 4.1+上将自签名SSL证书导入Volley

我开发使用Volley的 android应用程序。 所有通信都通过HTTPS连接完成。 因为我在本地环境中测试它,所以我使用Tomcat的自签名证书。

以前,我只有android 2.33.0设备。 现在我还有4.1和4.4

我的实现使用了这种方法: http : //developer.android.com/training/articles/security-ssl.html (部分未知的证书颁发机构 )在Android 高达4.1的设备上,它可以很好地工作。 带有自定义证书的SSLSocketFactory传递给Volley:

Volley.newRequestQueue(getApplicationContext(), new HurlStack(null, socketFactory)); 

但Android 4.1+会发生什么? 为什么它不起作用? 我也尝试使用NullX509TrustManager

 private static class NullX509TrustManager implements X509TrustManager { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } } 

但它仍然不起作用……

我用这里提到的解决方案解决了它:

http://developer.android.com/training/articles/security-ssl.html

主机名validation的常见问题

通过添加自定义主机名validation程序,在Volley项目中为我的主机名返回true并编辑HurlStack openConnection方法:

 if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) { ((HttpsURLConnection)connection).setSSLSocketFactory(mSslSocketFactory); ((HttpsURLConnection)connection).setHostnameVerifier(new CustomHostnameVerifier()); } 

我find的最简单的方法是添加这个类并从onCreate方法执行它

 new NukeSSLCerts().nuke(); 

它将齐射以信任所有SSL证书

信任所有SSL证书: – 如果要在测试服务器上进行测试,可以绕过SSL。 但是不要将此代码用于生产。

 public static class NukeSSLCerts { protected static final String TAG = "NukeSSLCerts"; public static void nuke() { try { TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { X509Certificate[] myTrustedAnchors = new X509Certificate[0]; return myTrustedAnchors; } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) {} @Override public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); } catch (Exception e) { } } 

}

请在Activity或您的Application Class中的onCreate()函数中调用此函数。

 NukeSSLCerts.nuke(); 

这可以用于Android中的Volley。 更多参考 https://newfivefour.com/android-trust-all-ssl-certificates.html