重定向计数和域证书

时间:2016-06-11 12:49:07

标签: java http ssl-certificate okhttp okhttp3

当我使用okhttp从这些网站获取内容时,我有三个问题:

  1. http://www.wp.com有错误: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径

  2. http://www.macys.com有错误: java.net.ProtocolException:后续请求太多:21

  3. http://www.vk.me有错误: javax.net.ssl.SSLPeerUnverifiedException:主机名www.vk.me未经验证: 证书:sha256 / Sx09coMBYByu6GDlS0E6daYLDVLydbmJjFNkTANfSg4 = DN:CN = .vk.com,OU =域控制已验证 subjectAltNames:[ .vk.com,vk.com]

  4. 2016/06/12更新:

    1. http://www.wordpress.com有错误: javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接
    2. 如何解决上述问题1-4?谢谢大家!

2 个答案:

答案 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();