我正在尝试使用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
库?
感谢。
答案 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[]
的连接重试。