我正在尝试使用 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
库?
谢谢。
最佳答案
我所做的是创建一个 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[]
的连接重试。
关于android - 将自签名证书加载到 HttpsUrlConnection 会破坏默认的 CA 证书验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24429485/