我希望连接到https
服务器,其self signed certificate
,而不修改我的客户端代码。
我知道这个问题已被多次询问,但我无法让它发挥作用。这就是我所做的:
在Firefox中打开https
服务器
点击网址信息,然后点击更多信息,然后查看证书,然后点击详细信息,然后点击导出。
选择默认导出类型设置(X.509 Certificate (PEM)
,保存为certificate.crt
),然后将其保存到磁盘。
打开命令提示符,转到客户端代码使用的java_home
文件夹,在我的情况下为c:\jdk-7u55-windows-x64\jre\bin
输入以下命令:
keytool -import -v -trustcacerts
-alias server-alias -file C:\Downloads\certificate.crt
-keystore cacerts.jks -keypass changeit
-storepass changeit
我也尝试过:
keytool -import -v -trustcacerts
-alias server-alias2 -file C:\Downloads\certificate.crt
-keystore keystore.jks
在完成所有这些之后,我仍然得到SSLHandshakeException
(无法找到所请求目标的有效证书路径)。
日志中的完全例外:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is 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
我不知道自己做错了什么,做了什么或如何进一步调试。
答案 0 :(得分:0)
指定所需的cacerts.jks
的绝对路径应该会有所帮助。当前使用keytool
只会为您当前的目录创建新的.jks(我猜)是c:\jdk-7u55-windows-x64\jre\bin
。默认的cacerts位置通常位于JAVA_HOME/jre/lib/security/cacerts
。或者你可以使用
-Djavax.net.ssl.trustStore=<path to custom store> -Djavax.net.ssl.trustStorePassword=<custom store_passwd>
作为您应用的起始参数。 More info