1

我正在尝试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库?

谢谢。

4

1 回答 1

4

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

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

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

就目前而言,您的代码正在将库存替换TrustManager[]为与您的 BKS 商店相关的库存。

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

于 2014-06-26T12:10:37.647 回答