获取javax.net.ssl.SSLException:在使用Jsoup抓取数据时收到致命警报:protocol_version

获取javax.net.ssl.SSLException:在使用Jsoup抓取数据时收到致命警报:protocol_version,第1张

获取javax.net.ssl.SSLException:在使用Jsoup抓取数据时收到致命警报:protocol_version

您要在此处使用Java 8,因为它默认情况下支持TLSv1.2以及其他必需的密码套件

为什么不使用Java 7?

我在使用Java 7(1.7.0_45)的盒子上进行了测试,并得到了相同的错误。

我激活了调试消息并强制使用TLSv1.2。

System.setProperty("javax.net.debug", "all");System.setProperty("https.protocols", "TLSv1.2");

然后我遇到了这个新错误:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

最后,我去了Comodoca的SSL分析器,看到了一些有趣的东西。根据SSL分析工具,您所定位的网站仅启用了以下密码套件:

密码套件已启用名称(ID)密钥大小(以位为单位)TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F)128 ECDH 256位(P-256) TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030)256 ECDH 256位(P-256) TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x9E)128 DH 2048位  TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x9F)256 DH 2048位

(请参阅完整详细信息)

在我这边,我没有上述任何套房。检查是否有它们:

SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, null, new java.security.SecureRandom());String[] scs = sc.getSocketFactory().getSupportedCipherSuites();Arrays.sort(scs);for(String s : scs) {   System.out.println(s);}

请参阅SSLSocketFactoryEx以启用所需的密码套件。

为什么选择Java 8?

另一方面,我成功地通过将代码从Java 7迁移到Java 8(1.8.0_20)来成功运行了代码,Java 8默认支持TLS
v1.2,并提供了所需的密码套件。

以下是Windows 7上Java 8(1.8.0_20)支持的密码套件(总共71个套件)的清单。

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256...TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

片段

try {    // Create a trust manager that does not validate certificate chains    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {        public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null;        }        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {        }        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {        }    } };    // Install the all-trusting trust manager    SSLContext sc = SSLContext.getInstance("SSL");    sc.init(null, trustAllCerts, new java.security.SecureRandom());        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());    // Fetch url    String url = "https://www.sos.nh.gov/corporate/soskb/SearchResults.asp?FormName=CorpNameSearch&Words=All&SearchStr=facebook&SearchType=Search";    Connection.Response response = Jsoup // .connect(url) // .timeout(60000) // .method(Connection.Method.GET) // .userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0") // .execute();    document document = response.parse();    System.out.println(document);} catch (Exception e) {    e.printStackTrace();}
最后的想法:

在安全性方面, 始终 使用最新的更新版本。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4906200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存