仅使用SS证书和CA证书而不使用密钥库

我需要设置一个javax.net.ssl.SSLContext ,以便在Jersey-Client应用程序中使用。 我想要做的就是接受自定义根证书的上下文。 是否真的无法生成密钥库文件并导入CA证书?

是否真的无法生成密钥库文件并导入CA证书?

有一种方法可以在没有密钥库文件的情况下执行此操作,但由于您必须以某种方式加载要信任的CA证书,因此您必须以某种方式加载文件或资源。

(您当然也可以实现自己的TrustManager ,使所有调用使用Certification Path 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); 

(记得关闭所有内容并处理exception。)

无论是以这种方式加载证书还是将证书从密钥库文件加载到类似的KeyStore实例中都更方便您自行决定。

Interesting Posts