我正在尝试通过https(SSL)连接到REST服务,但它无法正常工作。错误是{{1}}。我将问题追溯到这样的事实:证书颁发机构(名为的地方)尚未添加到JRE默认密钥库中的受信任机构的默认列表中。请参阅www.identrust.com或Will the cross root cover trust by the default list in the JDK/JRE?。
我已经看到了一些建议的解决方案,例如忽略身份验证(Which browsers and operating systems support Let’s Encrypt),或者将证书导入JRE密钥库(Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target),但我想要做的是拥有我的Java SE应用程序成功将SSL连接到具有www.identrust.com证书的站点以及任何其他有效站点。换句话说,我不想在每次JDK更新时更改JRE密钥库,我不想忽略该证书。
我可以从他们的网站(“unable to find valid certification path to requested target”, but browser says it's OK)获得identrust的证书,那么如何将其添加到我的应用程序的“信任链”中呢?
答案 0 :(得分:2)
忽略服务器证书检查是非常糟糕和不安全的做法。
将证书导入JRE密钥库也是不好的做法 - 考虑到JRE每年更新几次,这通常意味着您必须再次导入证书。
第三个也是最好的选择是明确信任丢失的CA证书(或直接信任服务器证书)。您可以通过将证书置于单独的Java密钥库中并将此密钥库包含在您的应用程序中(例如,在JAR文件中)来实现。
您可以使用系统属性javax.net.ssl.trustStore
或使用IMHO首选方式使用自定义SSLContext实现提供自定义信任存储,如下所述:How do I accept a self-signed certificate with a Java HttpsURLConnection?