您要在此处使用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();}
在安全性方面, 始终 使用最新的更新版本。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)