当我使用okhttp从这些网站获取内容时,我有三个问题:
http://www.wp.com有错误: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径
http://www.macys.com有错误: java.net.ProtocolException:后续请求太多:21
http://www.vk.me有错误: javax.net.ssl.SSLPeerUnverifiedException:主机名www.vk.me未经验证: 证书:sha256 / Sx09coMBYByu6GDlS0E6daYLDVLydbmJjFNkTANfSg4 = DN:CN = .vk.com,OU =域控制已验证 subjectAltNames:[ .vk.com,vk.com]
2016/06/12更新:
如何解决上述问题1-4?谢谢大家!
答案 0 :(得分:2)
鉴于这些网站尚未受到损害:
(1)您缺少受信任存储区中的根CA证书。如果网站使用的CA未随jdk一起提供,则可能发生这种情况。您需要使用keytool在受信任的商店中手动添加它。
(2)我研究了这个错误,发现这是由okhttp客户端抛出的,如果它收到超过20个重定向请求。我的来源是:https://github.com/square/retrofit/issues/1561
更新:我刚刚为macys.com做了浏览器加载页面跟踪。令人印象深刻,你应该给自己的经验:-)重定向是页面的正常加载行为,字体被重定向数十亿次。
OkHTTP将最大重定向值20实现为硬编码值。 https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/internal/http/HttpEngine.java(第91行)
(3)证书中的域名与提供的证书不匹配。这是多宿主页面上的常见错误。
要修复(1),除了添加CA之外,您还可以按照此处所述实现Java SSL证书路径验证器http://docs.oracle.com/javase/7/docs/technotes/guides/security/certpath/CertPathProgGuide.html#ValidationClasses
要修复(3),您需要按照SSL Certificate Verification in Java
所述实现TrustManager答案 1 :(得分:1)
对于第3期,您可以尝试以下
private HostnameVerifier getHostnameVerifier() {
return new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify(".vk.com", session);
}
};
}
然后
OkHttpClient client = new OkHttpClient.Builder()
.hostnameVerifier(getHostnameVerifier())
.build();