java 临时加CA好像出问题了
java Temporarily adding CA seems to malfunction
因为不是所有的 jvm 在他们的 cacert 密钥库中都有 letsencrypt,我需要在 运行 一个程序时临时添加它。我的代码如下:
public void addRootCA() throws Exception {
InputStream fis = new BufferedInputStream(this.getClassLoader().getResourceAsStream("letsencrypt.crt"));
Certificate ca = CertificateFactory.getInstance("X.509").generateCertificate(fis);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry("LetsEncrypt CA", ca);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
}
它似乎确实添加了证书(它丢失的异常消失了,我在服务器端得到了响应)但似乎没有加载来自默认 java 密钥库的其他 CA了。我的代码主要来自另一个标记为正确答案的 Whosebug 问题,所以我很困惑它的行为不正确。
其他 CA 未加载的原因是什么?或者可能存在完全不同的问题?
默认的 Java 密钥库没有加载,因为您没有加载它。您正在从 null
加载它,这会创建一个空的密钥库。您需要找到默认的 Java 密钥库,打开它,从中加载,然后关闭它。
因为不是所有的 jvm 在他们的 cacert 密钥库中都有 letsencrypt,我需要在 运行 一个程序时临时添加它。我的代码如下:
public void addRootCA() throws Exception {
InputStream fis = new BufferedInputStream(this.getClassLoader().getResourceAsStream("letsencrypt.crt"));
Certificate ca = CertificateFactory.getInstance("X.509").generateCertificate(fis);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry("LetsEncrypt CA", ca);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
}
它似乎确实添加了证书(它丢失的异常消失了,我在服务器端得到了响应)但似乎没有加载来自默认 java 密钥库的其他 CA了。我的代码主要来自另一个标记为正确答案的 Whosebug 问题,所以我很困惑它的行为不正确。
其他 CA 未加载的原因是什么?或者可能存在完全不同的问题?
默认的 Java 密钥库没有加载,因为您没有加载它。您正在从 null
加载它,这会创建一个空的密钥库。您需要找到默认的 Java 密钥库,打开它,从中加载,然后关闭它。