当前位置: 首页 > 知识库问答 >
问题:

获得一个异常javax.net.ssl.SSLHandshake异常:收到致命警报:protocol_version

娄学文
2023-03-14

我已经创建了一个webcrawler,它将返回一个URL页面。对于一些URL,我得到了javax。网ssl。SSLHandshakeException:收到致命警报:协议版本

这样做的目的只是解析返回的网页。所以我正在寻找绕过的方法。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。

我明白这对安全的影响,但这是在解析网页,不会发送任何数据。谢谢你的帮助。

共有1个答案

阎鸿煊
2023-03-14

好的,这适用于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());
 类似资料:
  • 我已经创建了一个SSLClient和SSLServer,也创建了密钥库作为"server.jks"为SSLServer和"client.jks"为SSLClient.它抛出一个异常""。我不知道为什么我得到这个异常。我遵循http://ruchirawageesha.blogspot.in/2010/07/how-to-create-clientserver-keystores.html为服务器和

  • 问题内容: 我创建了SSLClient和SSLServer,还为SSLServer 创建了密钥库,将其存储为 “ server.jks”, 对于SSLClient,创建了密钥库为 “ client.jks” 。首先,我执行SSLServer.java文件,然后执行SSLClient.java文件。抛出异常 “”。我不知道为什么我得到这个例外。我按照http://ruchirawageesha.bl

  • 我试图使用放心框架在AWS上为REST API构建一个测试自动化工具。我只是尝试使用一个简单的HTTP POST并检查输出JSON主体。但是当我在Eclipse中运行它时,我会得到SSLHandshakeExc0019。我确实试图研究这个问题,发现它可能与服务器证书有关(收到致命警报:通过SSLHandshakeExc0019handshake_failure),但当我通过POSTMAN测试它时,

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

  • 问题内容: 我正在尝试建立SSL套接字连接(并在客户端上执行以下操作) 我生成了证书签名请求以获取签名的客户证书 现在,我有一个私钥(在CSR中使用),一个签名的客户端证书和根证书(带外获得)。 我将私钥和签名的客户端证书添加到证书链中,并将其添加到密钥管理器中。和根证书到信任管理器。但是我收到了错误的证书错误。 我很确定自己使用的证书正确。是否也应该将签名的客户端证书添加到信任管理器?试了一下,

  • 我得到下面的错误,而记录网站通过JMeter(2.13)。我使用JavaJDK 1.8安装。一个SSLv3兼容ClientHello握手-发现使用小提琴手。尝试在jmeter.properties文件中设置https.default.protocol=SSLv3,但不起作用。javax.net.ssl.SSLHandshakeExcture:收到致命警报:handshake_failuresun.