我确实想将自签名证书导入 Java,因此任何尝试建立 SSL 连接的 Java 应用程序都会信任此证书。
到目前为止,我设法将其导入
keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem
不过,当我尝试运行 HTTPSClient.class
我仍然得到:
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
最佳答案
在 Windows 上最简单的方法是使用程序 portecle .
- 下载并安装 portecle。
- 首先要 100% 确定您知道使用哪个 JRE 或 JDK 来运行您的程序。在 64 位 Windows 7 上可能有很多 JRE。 Process Explorer 可以为您提供帮助,或者您可以使用:
System.out.println(System.getProperty("java.home"));
- 将文件 JAVA_HOME\lib\security\cacerts 复制到另一个文件夹。
- 在 Portecle 中单击文件 > 打开 keystore 文件
- 选择 cacerts 文件
- 输入此密码:changeit
- 点击工具 > 导入可信证书
- 浏览文件 mycertificate.pem
- 点击导入
- 单击“确定”以获取有关信任路径的警告。
- 在显示证书详细信息时单击“确定”。
- 单击"is"接受受信任的证书。
- 当它要求输入别名时单击“确定”,当它说已导入证书时再次单击“确定”。
- 点击保存。不要忘记这一点,否则更改将被丢弃。
- 将文件 cacerts 复制回您找到它的位置。
在 Linux 上:
您可以像这样从已经在使用它的 Web 服务器下载 SSL 证书:
$ echo -n | openssl s_client -connect www.example.com:443 | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt
可选择验证证书信息:
$ openssl x509 -in /tmp/examplecert.crt -text
将证书导入 Java cacerts keystore :
$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
-storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
关于java - 如何将自签名证书正确导入默认情况下可供所有 Java 应用程序使用的 Java keystore ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617210/