Java 重定向计数和域证书中的 okhttp 问题
Java okhttp issues in redirect count and domain cert
当我使用 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 年 6 月 12 日:
- 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();
当我使用 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 年 6 月 12 日:
- 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();