Certificate Authority 不在 JRE 时的 Java SSL 连接解决方​​案

标签 java security ssl https jsse

我正在尝试通过 https (SSL) 连接到 REST 服务,但没有成功。错误是 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。我追踪到问题的根源是证书颁发机构,一个名为 www.identrust.com 的地方, 尚未添加到 JRE 默认 keystore 中的默认可信授权列表中。参见 Will the cross root cover trust by the default list in the JDK/JRE?Which browsers and operating systems support Let’s Encrypt .

我看到了一些建议的解决方案,例如忽略身份验证(Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target),或将证书导入 JRE keystore (“unable to find valid certification path to requested target”, but browser says it's OK),但我想要做的是让我的 Java SE 应用程序成功连接到 SSL到具有来自 www.identrust.com 的证书的站点,以及任何其他有效站点。换句话说,我不想在每次更新 JDK 时更改 JRE keystore ,也不想忽略证书。

我可以从他们的网站 ( Certificate Chain Download Instructions ) 获得 identrust 的证书,那么如何将它添加到我的应用程序的“信任链”中呢?

最佳答案

忽略服务器证书检查是非常糟糕且不安全的做法。

将证书导入 JRE keystore 也是不好的做法 - 考虑到 JRE 每年更新几次,这通常意味着您必须再次导入证书。

第三个也是最好的选择是显式信任丢失的 CA 证书(或直接信任服务器证书)。为此,您可以将要信任的证书放在单独的 Java keystore 中,并将此 keystore 包含在您的应用程序中(例如,在 JAR 文件中)。

您可以使用系统属性 javax.net.ssl.trustStore 或使用恕我直言的首选方式使用此处所述的自定义 SSLContext 实现来提供自定义信任库:How do I accept a self-signed certificate with a Java HttpsURLConnection?

关于Certificate Authority 不在 JRE 时的 Java SSL 连接解决方​​案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36720143/

相关文章:

java - 抽象接口(interface)

java - 玩数字编程挑战(在java中查找子数组的平均值)

php - 这就是用 PHP 和 Ajax 防止 CSRF 所需要做的全部工作吗?

android - 打开安全的 websocket 连接时出现意外异常

asp.net - WCF SSL 无法为具有权限的 SSL/TLS 建立安全通道

java - 错误 : Projects containing version <unknown> deployment descriptors require XMI-format bindings or extensions files. ibm-web-bnd.xml

java - 内部类变量的可见性

security - 这种检查 "gift code"的方法安全吗?

php - file_get_contents() 和 Curl

apache - 为 tomcat 生成 SSL 证书时未提示输入 key 密码