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

Mar*_*edł 12 ssl android ssl-certificate x509certificate android-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));
Run Code Online (Sandbox Code Playgroud)

但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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但它仍然无效......

Ash*_*ini 5

信任所有 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) { 
    }
}
Run Code Online (Sandbox Code Playgroud)

}

请在 Activity 或应用程序类的 onCreate() 函数中调用此函数。

NukeSSLCerts.nuke();
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*edł 4

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

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

主机名验证的常见问题

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

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

  • 我不明白 (5认同)