我需要设置一个javax.net.ssl.SSLContext
用于 Jersey-Client 应用程序。我要做的就是接受自定义根 ca 证书的上下文。真的没有办法生成密钥库文件和导入 CA 证书吗?
问问题
31879 次
1 回答
45
真的没有办法生成密钥库文件和导入 CA 证书吗?
有一些方法可以在没有密钥库文件的情况下执行此操作,但是由于您必须以一种或另一种方式加载您想要信任的 CA 证书,因此您必须以某种方式加载文件或资源。
(您当然也可以实现自己的TrustManager
,使所有调用都使用认证路径 API,而KeyStore
根本不使用 API,但这只会增加代码的复杂性,而不是降低代码的复杂性。您还需要了解Java PKI 程序员指南正确执行此操作。)
如果您真的不想要密钥库文件,您可以使用KeyStore
内存中的 API 并直接加载证书。
这些方面的东西应该可以工作(未经测试):
InputStream is = new FileInputStream("cacert.crt");
// You could get a resource as a stream instead.
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate caCert = (X509Certificate)cf.generateCertificate(is);
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null); // You don't need the KeyStore instance to come from a file.
ks.setCertificateEntry("caCert", caCert);
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
(请记住关闭所有内容并处理异常。)
以这种方式加载证书还是将证书KeyStore
从密钥库文件加载到类似实例中更方便,由您决定。
于 2013-08-29T15:07:37.600 回答