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

时间:2013-08-29 14:31:29

标签: java ssl keystore ca jersey-client

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

1 个答案:

答案 0 :(得分:37)

  

确实无法生成密钥库   文件并导入CA证书?

如果没有密钥库文件,有办法实现,但由于您必须加载您希望以某种方式信任的CA证书,您必须以某种方式加载文件或资源。

(您当然也可以实现自己的TrustManager,使得所有调用都使用了认证路径API,而根本不使用KeyStore API,但这只会增加代码的复杂性,不要减少它。您还需要了解Java PKI Programmer's Guide才能正确执行此操作。)

如果您真的不想要密钥库文件,可以在内存中使用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实例中更方便您自行决定。