对于那些愿意进行本地配置更改并包括备份配置文件的人,以下是详细答案:
1. 在更改之前测试是否正常工作
如果您还没有测试程序,可以使用我的Java SSLPing ping程序进行测试TLS握手(将适用于任何SSL / TLS端口,而不仅仅是HTTPS)。我将使用预构建的SSLPing.jar,但阅读代码并自行构建是一项快速且容易的任务:
$ git clone https://github.com/dimalinux/SSLPing.git
Cloning into 'SSLPing'...
[... output snipped ...]
因为我的Java版本早于1.8.0_101(本文撰写时未发布),因此Let's Encrypt证书默认情况下将无法验证。在应用修复程序之前,让我们看一下失败的情况:
$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[... output snipped ...]
2. 导入证书
我正在使用 Mac OS X 操作系统,并设置了 JAVA_HOME 环境变量。接下来的命令将假定您正在修改与 Java 安装相关联的此变量:
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/
备份 cacerts 文件,以便在修改时可以回退并避免重新安装 JDK:
$ sudo cp -a $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts.orig
下载我们需要导入的签名证书:
$ wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.der
执行导入操作:
$ sudo keytool -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt -importcert -alias lets-encrypt-x3-cross-signed -file lets-encrypt-x3-cross-signed.der
Certificate was added to keystore
3. 确认更改后它正在工作
确认Java现在可以连接到SSL端口:
$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
Successfully connected