Android Volley 自签名证书

Posted

技术标签:

【中文标题】Android Volley 自签名证书【英文标题】:Android Volley Self signed certificate 【发布时间】:2017-09-01 01:22:48 【问题描述】:

我正在尝试从我的 android 应用程序访问 HTTPS url。 我的服务器端有自签名证书(server_certificate.cer)。

我想知道如何将自签名证书添加到 volley 网络请求以信任我的自签名证书。 尝试使用http://blog.applegrew.com/2015/04/using-pinned-self-signed-ssl-certificate-with-android-volley/

并得到 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certificate path not found.

【问题讨论】:

【参考方案1】:

我成功地遵循了该教程。

您需要创建一个密钥库文件(例如“cert_keystore.pkcs12”)来包含您的服务器证书并将其添加到您的应用中。

我发现对密钥库文件使用 PKCS12 格式是最简单的。 (使用keytool转换密钥库时添加-deststoretype PKCS12参数)

我的测试服务器位于 IP 地址上,我必须禁用主机名验证才能使用我的自签名证书。这个other tutorial 很有用。

我必须将带有自定义 HostnameVerifier 的 HttpsURLConnection.setDefaultHostnameVerifier()HttpsURLConnection.setDefaultSSLSocketFactory () 添加到 newSslSocketFactory()。

(Volley.newRequestQueue(mCtx.getApplicationContext(), new HurlStack(null, newSslSocketFactory())中使用newSslSocketFactory())

新的 newSslSocketFactory() 函数现在是:

private SSLSocketFactory newSslSocketFactory()

    try
    
        KeyStore trusted = KeyStore.getInstance ("PKCS12");

        // Get the raw resource, which contains the keystore with
        // your trusted certificates (root and any intermediate certs)
        InputStream in = mCtx.getApplicationContext().getAssets ().open ("cert_keystore.pkcs12");
        try 
            // Initialize the keystore with the provided trusted certificates
            // Provide the password of the keystore
            trusted.load (in, "password".toCharArray ());
         finally 
            in.close();
        

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(trusted);


        HostnameVerifier hostnameVerifier = new HostnameVerifier() 
            @Override
            public boolean verify (String hostname, SSLSession session) 

                return hostname.equals ("192.168.1.10"); //The Hostname of your server

            
        ;


        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);


        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        SSLSocketFactory sf = context.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory (sf);

        return sf;
    
    catch (Exception e)
    
        throw new AssertionError(e);
    

【讨论】:

以上是关于Android Volley 自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

如何使用未知 CA 自签名的证书让 Android Volley 执行 HTTPS 请求?

nv-websocket-client 自签名证书

Android使用SSL自签名证书

Android使用SSL自签名证书

Android使用SSL自签名证书

android 生成签名证书