一尘不染

默认情况下,如何正确地将自签名证书导入到Java密钥库中,所有Java应用程序都可以使用该证书?

java

我确实想将自签名证书导入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

阅读 503

收藏
2020-03-12

共1个答案

一尘不染

在Windows上,最简单的方法是使用程序portecle。

  1. 下载并安装portecle。
  2. 首先,请确保100%确保知道使用哪个JRE或JDK来运行程序。在64位Windows 7上,可能会有很多JRE。Process Explorer可以帮助你解决此问题,或者你可以使用:System.out.println(System.getProperty(“java.home”));
  3. 将文件JAVA_HOME \ lib \ security \ cacerts复制到另一个文件夹。
  4. 在Portecle中,单击文件>打开密钥库文件
  5. 选择cacerts文件
  6. 输入此密码:changeit
  7. 单击工具>导入可信证书
  8. 浏览文件mycertificate.pem
  9. 点击导入
  10. 单击“确定”以获取有关信任路径的警告。
  11. 当显示有关证书的详细信息时,单击“确定”。
  12. 单击“是”以接受证书为受信任的证书。
  13. 当要求输入别名时,请单击“确定”,然后在说已导入证书时再次单击“确定”。
  14. 点击保存。不要忘记这一点,否则更改将被放弃。
  15. 将文件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密钥库中:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
2020-03-12