Java 重定向计数和域证书中的 okhttp 问题

Java okhttp issues in redirect count and domain cert

当我使用 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]

更新于 2016 年 6 月 12 日:

  1. http://www.wordpress.com 有以下错误: javax.net.ssl.SSLHandshakeException: 握手期间远程主机关闭连接

如何解决上述问题1-4?谢谢大家!

考虑到站点没有被破坏:

(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),您需要按照此处所述实施 TrustManager SSL Certificate Verification in Java

对于您的第 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();