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

Rem*_*emo 17 java ssl ca keystore jersey-client

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

Bru*_*uno 39

是否真的无法生成密钥库文件并导入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);
Run Code Online (Sandbox Code Playgroud)

(记得关闭所有内容并处理异常.)

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

  • 对于遇到此答案的任何人,请务必使用导入`javax.net.ssl.TrustManagerFactory`而不是`com.sun.net.ssl.TrustManagerFactory`; 后者现已弃用.干杯. (5认同)
  • @MattClark一般来说,你不应该直接导入任何`com.sun.*`或`sun.*`包. (3认同)