我尝试通过
java内置功能(HttpURLConnection)建立https连接.但是我得到了这个例外:
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)
...
...
我的证书链是:
根证书 – >中级证书 – > Web服务器证书
使用的证书通过“路径发现”的含义是正确的.信任锚是Root证书,它在我系统上的java密钥库中导入.中间证书不是……但是
>中间证书由我信任的根签署 – 所以我也相信中间人.
> Web服务器证书使用中级证书签名,我相信(第1点)
那么验证必须成功通过吗?我弄错了吗?
在某处我读到了这个:
Browsers can do auto-discovery, server to server doesn’t.
但缺乏这种功能是非常基本的.有没有明确的方法这样做auto-discovery?
**更新
是的,这是问题,GPI.我很困惑,因为浏览器可以验证服务器证书但java应用程序不能.
这种行为的原因是:
>服务器只发送最终证书,而不是整个证书
链;
>证书最近被买了,并且是相对签名的
新中间证书;
>浏览器具有相对最新的证书列表
包括中间证书;
> java有相对不是最新的证书列表,和
中间证书不在里面.
>浏览器通过中间体验证最终证书
certificate java无法检查证书链,因为:1.
链没有发送; 2.最终证书的签名者(
中间一个)不是信任锚.
解决方案可能是:
>服务器返回整个证书链
>要在java信任库中添加的中间证书