![如何将 Let's Encrypt 添加到 Java 允许的证书?](https://linux22.com/image/1474991/%E5%A6%82%E4%BD%95%E5%B0%86%20Let's%20Encrypt%20%E6%B7%BB%E5%8A%A0%E5%88%B0%20Java%20%E5%85%81%E8%AE%B8%E7%9A%84%E8%AF%81%E4%B9%A6%EF%BC%9F.png)
我最近将我的几个域名切换到了 Let's Encrypt Private Beta,结果我的几个 Java 程序都停止工作了,因为我认为证书不在信任库中。
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径
我尝试了各种方法,例如进入 Windows 的 Java 配置面板,或者将根证书添加到 cacerts。
我们如何从 Let's Encrypt 根 CA 导出/下载 .csr 或 .p12 文件,以便将其导入 Java 证书列表,最好以这样的方式接受所有 Let's Encrypt 安全域,而不仅仅是我的域?
我尝试下载根证书https://letsencrypt.org/certificates/并将它们添加到列表中,但无济于事。我也尝试过将其添加/etc/letsencrypt/live/<my_website>/cert.pem
到网站,但没有成功。我甚至尝试使用 keytool 将其添加到 cacerts 中,如下所示:https://stackoverflow.com/questions/2138940/import-pem-into-java-key-store无论我尝试什么,它都不起作用(出现上述相同的错误)。
在谷歌搜索的过程中,我还发现了这一点:https://community.letsencrypt.org/t/will-the-cross-root-cover-trust-by-the-default-list-in-the-jdk-jre/134/13但无法利用其中的信息。
答案1
下载所有证书https://letsencrypt.org/certificates/(选择德格式),并使用这种命令逐个添加它们(例如letsencryptauthorityx1.der
):
keytool -import -keystore PATH_TO_JDK\jre\lib\security\cacerts -storepass changeit -noprompt -trustcacerts -alias letsencryptauthorityx1 -file PATH_TO_DOWNLOADS\letsencryptauthorityx1.der
答案2
更新:根据https://community.letsencrypt.org/t/which-browsers-and-operating-systems-support-lets-encrypt/4394,DST Root CA X3 于 2016-07-19 添加版本 7u111+ 和 8u101+,因此可能不需要在更新版本的 JDK/JRE 7 和 8 上添加证书。
我已经通过导入中级证书解决了这个问题(https://letsencrypt.org/certificates/)到信任存储中(使用 keytool 或 portecle,请参阅下面的链接)。显然,添加“ISRG 根 X1”根证书本身无法工作,添加所有证书后错误就会消失。
为了实现这一点,我遵循了该问题最受欢迎的答案:https://stackoverflow.com/questions/11617210/how-to-properly-import-a-selfsigned-certificate-into-java-keystore-that-is-avail但它也应该适用于https://stackoverflow.com/questions/2138940/import-pem-into-java-key-store