当前位置: 首页 > 面试题库 >

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

卫志泽
2023-03-14
问题内容

我正在尝试使用Jsoup从站点获取数据。链接到该网站是点击这里!

这是我的代码以获取数据。`

    // WARNING: do it only if security isn't important, otherwise you have 
    // to follow this advices: http://stackoverflow.com/a/7745706/1363265
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){
        public X509Certificate[] getAcceptedIssuers(){return null;}
        public void checkClientTrusted(X509Certificate[] certs, String authType){}
        public void checkServerTrusted(X509Certificate[] certs, String authType){}
    }};

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        ;
    }`

String url = "https://www.sos.nh.gov/corporate/soskb/SearchResults.asp?FormName=CorpNameSearch&Words=Starting&SearchStr="+query+"&SearchType=Search"; Connection.Response response = Jsoup.connect(url).timeout(30000) .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();

请在这里告诉我我的错误是什么。


问题答案:

您要在此处使用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();
}

最后的想法:

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



 类似资料:
  • 问题内容: 有人遇到过此错误吗?我是SSL新手,我缺少的ClientHello明显有问题吗?没有ServerHello响应时抛出该异常。任何建议表示赞赏。 { http://xml.apache.org/axis/ } stackTrace: … 问题答案: 在Java 1.8上,默认TLS协议为v1.2。在Java 1.6和1.7上,默认的TLS1.0已过时。我在Java 1.8上收到此错误,因

  • 我试图用基于Java6(Update31)的客户机调用运行在JDK7/Wildfly8.2上的受SSL保护的web服务。 我在客户端遇到的第一个问题是: javax.net.ssl.sslException:收到致命警报:expectionted_message sslHandShakeException:SSLv2Hello被禁用 速查显示, 客户端默认禁用SSLv2Hello:在Java SE

  • 我试图使用Java-pns向iPhone发送推送通知,但我得到以下错误-javax.net.ssl.sslhandShakeException:Received Fatalic Alert:handshake_failure 我的密码是- 对于NotificationTest.VerifyKeystore,我得到的有效信息是文件和密钥库。 拜托,有人能帮我吗? 提前谢谢... 在我的日志里我看到了

  • 问题内容: 我正在尝试使用Java-pns将推送通知发送到iPhone,但出现以下错误-javax.net.ssl.SSLHandshakeException :收到致命警报:handshake_failure 我的代码是- 对于 NotificationTest.verifyKeystore, 我得到的是这个有效的是File and Keystore。 我不明白为什么会收到此错误。 请有人可以帮

  • 当我通过HTTPS访问一个服务时,我看到下面的错误。我尝试在Soap ui VM选项文件中更改TLS版本,如下所示:

  • 问题内容: 我正在尝试使用 liferay中的* javapns 库将推送通知发送到我的设备。这是代码: * 调用pushNotification时出现此错误: 我已经用谷歌搜索了,但是找不到任何解决方案。 有谁知道如何解决这个问题? 问题答案: 当您要连接的服务器没有来自授权CA的有效证书时,通常会引发该异常。 简而言之,您尝试连接的服务器很可能使用自签名证书,因此您必须在Java代码中容纳该证