我正在阅读keymanager和trustmanager之间的区别,但仍然不确定为什么只使用keymanager对我的代码起作用。
我正在编写一些客户端代码,使用提供的自签名证书,使用Android中的HTTPS将图像上传到SSL服务器。 以下是代码片段:
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// load ca
InputStream caInput = getActivity().getResources().getAssets().open("qa_upld.cer");
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca = " + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
// Create a KeyStore
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore, null);
KeyManager[] keyManagers = kmf.getKeyManagers();
// Create a TrustManager that trusts the CAs in our KeyStore
//TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
//tmf.init(keyStore);
// Using trustmanager not working for some reason..
// Create an SSLContext that uses our TrustManager
// Out of 3 possibilities, (keymanager,trustmanager),(null,trustmanager)
// and (keymanager,null) only the following works
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagers, null, null);
我的问题是为什么在这种情况下使用信任管理员不工作?我在测试案件时遇到了“找不到信任锚”,这让我很困惑,因为我以为我已经安装了信任管理员?是因为我使用的是自签名证书,而不是公开证书?
切换到keymanager似乎解决了这个问题。