我有一个Java客户端试图使用自签名证书访问服务器。
当我试图发布到服务器,我得到以下错误:
无法找到请求目标的有效认证路径
在对这个问题做了一些研究之后,我做了以下工作。
保存我的服务器域名为根。cer文件。
在我的Glassfish服务器的JRE中,我运行了这个:
Keytool -import -alias example -keystore cacerts -file root.cer
为了检查证书是否成功添加到我的cacert,我这样做:
Keytool -list -v -keystore cacerts
我可以看到证书是存在的。
然后我重新启动Glassfish并重新尝试“post”。
我还是得到同样的错误。
我有一种感觉,这是因为我的Glassfish实际上没有读取我修改过的cacert文件,但可能是其他一些文件。
你们中有人遇到过这样的问题吗,可以帮我找到正确的方向吗?
在我的例子中,我遇到了这个问题,因为在我的tomcat进程中,特定的密钥存储库是使用的
-Djavax.net.ssl.trustStore=/pathtosomeselfsignedstore/truststore.jks
当我将证书导入JRE/lib/security的cacert时,没有反映更改。
然后执行以下命令,其中/tmp/cert1。Test包含目标服务器的证书
keytool -import -trustcacerts -keystore /pathtosomeselfsignedstore/truststore.jks -storepass password123 -noprompt -alias rapidssl-myserver -file /tmp/cert1.test
可以再次检查证书导入是否成功
keytool -list -v -keystore /pathtosomeselfsignedstore/truststore.jks
并查看是否在别名rapidssl-myserver中找到您的taget服务器
JDK 8迁移到JDK 10时的解决方案
证书是非常不同的
JDK 10有80个,而JDK 8有151个
JDK 10最近添加了certs
https://dzone.com/articles/openjdk-10-now-includes-root-ca-certificates
http://openjdk.java.net/jeps/319
JDK 10
root@c339504909345:/opt/jdk-minimal/jre/lib/security # keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 80 entries
JDK 8
root@c39596768075:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts # keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 151 entries
修复步骤
我删除了JDK 10证书,并将其替换为JDK 8
由于我正在构建Docker图像,我可以使用多阶段构建快速完成
我正在使用jlink作为/opt/jdk/bin/jlink \构建一个最小的JRE
——模块路径/ opt / jdk / jmods……
这里是不同的路径和命令的顺序…
# Java 8
COPY --from=marcellodesales-springboot-builder-jdk8 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts /etc/ssl/certs/java/cacerts
# Java 10
RUN rm -f /opt/jdk-minimal/jre/lib/security/cacerts
RUN ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
(转载自我的其他回复)
使用java软件发行版中的cli实用工具keytool导入(并信任!)所需的证书
示例:
从命令行更改目录到jre\bin
检查密钥库(在jre\bin目录中找到的文件)
Keytool -list -keystore ..\lib\security\cacerts . txt
密码为changeit
从需要的服务器下载并保存链中的所有证书。
添加证书(在需要删除文件..\lib\security\cacerts上的“只读”属性之前),运行:
keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore.使用实例\lib\security\cacerts -file "r:\root.crt"
我偶然发现了这么一个简单的小窍门。
其他解决方案需要使用InstallCert.Java和JDK
来源:http://www.java-samples.com/showtutorial.php?tutorialid=210
在我的例子中,我遇到了这个问题,因为在我的tomcat进程中,特定的密钥存储库是使用的
-Djavax.net.ssl.trustStore=/pathtosomeselfsignedstore/truststore.jks
当我将证书导入JRE/lib/security的cacert时,没有反映更改。
然后执行以下命令,其中/tmp/cert1。Test包含目标服务器的证书
keytool -import -trustcacerts -keystore /pathtosomeselfsignedstore/truststore.jks -storepass password123 -noprompt -alias rapidssl-myserver -file /tmp/cert1.test
可以再次检查证书导入是否成功
keytool -list -v -keystore /pathtosomeselfsignedstore/truststore.jks
并查看是否在别名rapidssl-myserver中找到您的taget服务器