将自签名证书加载到HttpsUrlConnection会中断默认CA证书验证

时间:2014-06-26 11:35:59

标签: android ssl android-volley httpsurlconnection

我正在尝试使用HttpsUrlConnection加载BKS并使用以下代码,但是它打破了我的其他服务器的默认CA证书验证。

try {
    TrustManagerFactory tmf = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    KeyStore ks = KeyStore.getInstance("BKS");
    InputStream in = ctw.getResources()
            .openRawResource(R.raw.bks);
    ks.load(in, "password".toCharArray());
    in.close();
    tmf.init(ks);
    TrustManager[] tm = tmf.getTrustManagers();

    KeyManagerFactory kmf = KeyManagerFactory
            .getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(ks, "password".toCharArray());

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(kmf.getKeyManagers(), tm, null);

    HttpsURLConnection
            .setDefaultHostnameVerifier(new HostnameVerifier() {

                @Override
                public boolean verify(String hostname,
                        SSLSession session) {
                    return true;
                }
            });

    HttpsURLConnection
            .setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    e.printStackTrace();
}

我得到的错误是:

com.android.volley.NoConnectionError:
javax.net.ssl.SSLHandshakeException:
java.security.cert.CertPathValidatorException:
Trust anchor for certification path not found.

我正在使用Volley库来处理网络请求。我的代码是错误的还是应该修改Volley库?

感谢。

1 个答案:

答案 0 :(得分:3)

我所做的是创建一个CompositeTrustManager,可以检查多个来源,包括自签名证书和默认CA.它隐藏在the TrustManagerBuilder API中的my CWAC-Security library后面。您可以使用以下代码:

new TrustManagerBuilder(this)
  .selfSigned(R.raw.bks, "password".toCharArray())
  .or()
  .useDefault();

然后调用build()以获取处理自签名证书和默认CA的TrustManager[]

目前,您的代码是替换股票TrustManager[],其中一个与您的BKS商店绑定。

另一种方法是捕获失败并使用缺少自定义TrustManager[]的连接重试。