【问题标题】:Connecting via SSL with Java: The basics通过 SSL 与 Java 连接:基础知识
【发布时间】: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 存储

标签: java ssl


【解决方案1】:

许多网站使用自签名证书进行 ssl。您应该将它们添加到您的 JRE 的 cacerts 文件中。在这种情况下,我使用以下步骤:

  1. 使用浏览器访问https://mysite.com
  2. 将其证书保存到本地计算机
  3. 使用 keytool 命令将其导入您的 cacerts。命令行如下所示:keytool -import -alias mysite -file mysite.cer -keystore {path/to/cacerts}

作为替代方案,您可以使用openssl s_client 实用程序来检索mysite.com 证书。

【讨论】:

  • 谢谢,这就像一个魅力!我创建了一个新的密钥库而不是使用 cacerts,因为我不确定它想要什么密码,但这是一个小细节。所以,如果我理解正确的话,我的浏览器会自动检测到该站点有一个所谓的self-signed certificate 并自动导入它,但我必须手动查找并导入它才能让 Java 识别它。
  • JRE cacerts 的默认密码是changeit
  • 是的,浏览器可以检测到证书是自签名的,或者是这样。通常,它们会显示如下警告:The site's security certificate is not trusted 在这种情况下。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 2014-06-19
  • 2013-03-23
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多