在文件系统上直接使用PEM编码CA证书进行HTTPS请求?

这类似于将PEM导入Java密钥库 。 但问题的答案使用OpenSSL进行转换和工具,将它们导入文件系统的密钥存储区。

我正在尝试使用格式良好的X509证书作为信任锚:

static String CA_FILE = "ca-rsa-cert.pem"; public static void main(String[] args) throws Exception { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(CA_FILE), null); TrustManagerFactory tmf = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); SSLContext context = SSLContext.getInstance("TLS"); context.init(null, tmf.getTrustManagers(), null); // Redirected through hosts file URL url = new URL("https://example.com:8443"); HttpsURLConnection connection = (HttpsURLConnection) url .openConnection(); connection.setSSLSocketFactory(context.getSocketFactory()); ... } 

当我尝试运行该程序时,出现错误:

 $ java TestCert Exception in thread "main" java.io.IOException: Invalid keystore format at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650) at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55) at java.security.KeyStore.load(KeyStore.java:1214) at TestCert.main(TestCert.java:30) 

我也试过KeyStore ks = KeyStore.getInstance("PEM");getInstance("X509"); ,但他们也没有工作。

我知道Java支持PEM和DER编码证书,因为这是Web服务器发送给客户端的内容。 但是没有一个KeyStoreType似乎符合我的需求,所以我怀疑我没有使用正确的API。

我想直接使用它们而不是将它们导入长期存在的KeyStore是:

  1. 有数百个PEM证书可供测试
  2. 证书在我的文件系统上
  3. 使用文件系统中的证书与我的工作流程相匹配
  4. 我不想使用opensslkeytool
  5. 我不想执行密钥库维护

如何在文件系统上采用格式良好的PEM编码证书并直接使用它?

我在KeyStore.TrustedCertificateEntry的Set certificate中尝试以另一种方式做到了这个答案? 。 它基于Vit Hnilica在从密钥库加载证书时的答案。 因为大多数Stack Overflow的答案都是以“使用openssl转换,然后使用keytool ……”开头的,所以我将回答这个问题。

 String CA_FILE = ...; FileInputStream fis = new FileInputStream(CA_FILE); X509Certificate ca = (X509Certificate) CertificateFactory.getInstance( "X.509").generateCertificate(new BufferedInputStream(fis)); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(null, null); ks.setCertificateEntry(Integer.toString(1), ca); TrustManagerFactory tmf = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); ...