【发布时间】:2014-01-31 10:36:56
【问题描述】:
我需要使用 Java 通过 HTTPS 连接到 URL。我对 SSL 证书没有任何经验,这里的大多数问题都假设有一些基本知识。我希望这里有人可以让我开始了解基础知识。
当我将 URL 放入浏览器时,它可以正常连接。当我使用 Java 时:
new URL("https://mysite.com/").openStream()
它抛出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
This question 展示了如何忽略整个证书,但这感觉不对。我只是想使用与浏览器相同的证书。
我已经尝试添加-Djavax.net.ssl.trustStore=cacerts 属性,它将异常更改为javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty,我从this question 中获取了它,这意味着它找不到名为cacerts 的信任存储。不过,我不确定还要指定什么。
【问题讨论】:
-
看来
mysite.com使用的是自签名证书,还是这样。您是否已将mysite.com提供的证书导入cacerts? -
我没有手动添加任何东西。我想既然我的浏览器可以找到证书,Java 应该也可以,我只需要告诉它在哪里看。
-
您需要使用 jvm 附带的
keytool命令在您的密钥库中导入服务器证书(很可能是签署它的根 CA)。cacerts是 jvm 附带的默认 CA 存储