我尽量让通过Java内置的功能,为HTTPS连接( HttpURLConnection
)。 但是,我得到这个异常:
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
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
...
...
我的证书链是:
Root certificate -> Intermediate certificate -> Web server certificate
所使用的证书是由“路径发现”的含义是正确的。 该信任锚的根证书,这是Java的密钥库导入我的系统上。 中间证书是不是... BUT
- 所以我在中间太信任 - 中级证书是由根,谁我相信签署。
- Web服务器证书与中级证书,我相信签署(点1)
因此在验证时必须顺利通过? 难道我得到什么了吗?
我曾读到这样的:
浏览器可以做到自动发现,服务器对服务器没有。
但没有这个功能是非常基本的。 是否有这样做的明确的方式自动发现 ?
*更新
是的,这是问题,GPI。 我很困惑,因为浏览器可以验证服务器证书,但Java应用程序不能。 这种行为的原因是:
- 服务器只发送最后的证书,而不是整个证书链;
- 该证书是最近买的,它与相对较新的中级证书签名;
- 浏览器具有相对向上最新证书,包括中间证书的列表;
- java的具有相对没有达到最新的证书列表,和中间证书是不是里面。
- 浏览器验证在该中间证书的Java最终证书可能不检查,因为证书链:1.未发送的链; 2.最终证书(中间一个)的签名者不是信任锚。
该解决方案可以是:
- 服务器返回的整个证书链
- 在Java信任存储要添加的中间证书