KeyManager和TrustManager之间的区别?

时间:2016-02-16 20:16:39

标签: java android ssl ssl-certificate keystore

我正在阅读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似乎解决了这个问题。

0 个答案:

没有答案