java - 获取异常 javax.net.ssl.SSLHandshakeException:收到致命警报:protocol_version
问题描述
我创建了一个网络爬虫,它将返回 URL 页面。对于某些 URL,我得到: javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
这样做的目的只是解析返回的网页。所以我正在寻找绕过的方法。SSL 验证
(s, sslSession) -> true
所以我创建了一个 SSLConnectionSocketFactory
private SSLConnectionSocketFactory sslFactory() {
SSLContext sslcontext = null;
try {
sslcontext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslcontext, (s, sslSession) -> true);
return sslConnectionSocketFactory;
}
然后将其添加到 HTMLClient
var clientBuilder = HttpClientBuilder.create()
.setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())
.setRedirectStrategy(new LaxRedirectStrategy())
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslFactory());
根据我的研究,这应该绕过 SSL 验证,但它仍然抛出异常。我正在使用 httpclient-4.5.13。
我了解安全隐患,但这是在解析网页,它不会发送任何数据。谢谢你的帮助。
解决方案
好的,这适用于 httpclient-4.5.13 java 11,它不适用于 Java 16。所以设置受信任的证书。
private SSLContext SSLConnection() throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) { }
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
return sc;
}
并将其添加到 clientBuilder
var clientBuilder = HttpClientBuilder.create()
.setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())
.setRedirectStrategy(new LaxRedirectStrategy())
.setDefaultCookieStore(cookieStore)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setSSLContext(SSLConnection());
推荐阅读
- amazon-web-services - 从 api 返回到 aws 控制器的 S3 预签名 URL 不起作用
- curl - 使用 curl 发布请求将数据加载到 zipkin
- xml - Flutter删除字符模式之间的字符串中的空格和换行符
- python-3.x - 如何在 python3.5 中以编程方式运行 ansilbe-playbook 时设置 extra_vars?(Ansible 版本 - 2.8)
- c++ - 使用变量获取 STL 容器的 size_type
- javascript - 如何将活动元素 id 添加到 url
- amazon-web-services - 用户 xxx 无权加密流 xxx 中的记录
- mysql - MySQL 中其他表多个值的 SUBSTR 和 REGEXP 组合匹配
- azure-active-directory - 无法使用 Microsoft Graph API 添加应用程序分配
- sql - 使用 Group By 将 Where-Condition 添加到联接视图