在文件系统上直接使用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
是:
- 有数百个PEM证书可供测试
- 证书在我的文件系统上
- 使用文件系统中的证书与我的工作流程相匹配
- 我不想使用
openssl
或keytool
- 我不想执行密钥库维护
如何在文件系统上采用格式良好的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); ...
- 创建名为’entityManagerFactory的bean时出错
- Spring Boot Starter Cache – 缺少Velocity?
- 未加权图的最短路径(最少节点)
- Java 未经检查的案例警告
- Bulider Design Pattern为具有大量参数的方法制作通用方法
- 为什么char +另一个char =一个奇怪的数字
- Mac OSX上的Java进程不会释放套接字
- 带有Tomcat的JSR-356 WebSockets – 如何限制单个IP地址内的连接?
- Java NoSuchAlgorithmException – SunJSSE,sun.security.ssl.SSLContextImpl $ DefaultSSLContext