Java - 收到致命警报:handshake_failure

Posted

技术标签:

【中文标题】Java - 收到致命警报:handshake_failure【英文标题】:Java - Received fatal alert: handshake_failure 【发布时间】:2019-01-02 09:44:53 【问题描述】:

我正在尝试获取网站的 html 源代码。

我的代码:

public static void main(String[] args) 
    URL url;
    InputStream is;
    try 
        url = new URL("https://www.trackobot.com/");
        is = url.openStream();
     catch (MalformedURLException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    

但是,当运行这段代码时,我得到一个异常:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
   at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
   at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
   at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)
   at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)
   at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
   at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
   at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
   at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
   at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
   at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1546)
   at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
   at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
   at java.net.URL.openStream(URL.java:1045)
   at JsoupTutorial.ConnectToUrl.main(ConnectToUrl.java:24)

如果我更改网站,它会运行良好,即使是 PayPal 等 https 网站。但是,我仍然有一些站点无法正常工作并抛出异常。示例中的这个站点是它不起作用的站点之一。

我搜索了一下,了解到需要将此站点的证书导入Java keystore。 我说的对吗?

我的问题是 Chrome 如何设法进入那些“安全”网站并获取 HTML 代码?有人必须将证书更新(导入)到 Chrome Cer 数据库。谁执行此操作以及何时发生? (以防我在上面是正确的)。

无论如何,我想设法完美地加载这些网站并接收我想要的数据。我在哪里可以从基础学习它?

谢谢。

【问题讨论】:

请看这个以获得完整的解释***.com/a/34111150 和这个让我们加密证书兼容性列表letsencrypt.org/docs/certificate-compatibility 【参考方案1】:

这里的问题几乎可以肯定是您正在尝试访问使用 SSL/HTTPS 的站点,但您没有使用支持它的 API。您可以尝试将HttpsURLConnection 与接受所有内容的(坏)信任存储一起使用。 永远不要在生产环境中这样做

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[] new DefaultTrustManager(), new SecureRandom());
SSLContext.setDefault(ctx);

URL url = new URL("https://www.trackobot.com/");
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setHostnameVerifier(new HostnameVerifier() 
    @Override
    public boolean verify(String arg0, SSLSession arg1) 
        return true;
    
);
con.setRequestMethod("GET");
System.out.println("Response Code : " + con.getResponseCode());

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
StringBuffer response = new StringBuffer();

while ((line = in.readLine()) != null) 
    response.append(line);

in.close();

System.out.println(response.toString());

private static class DefaultTrustManager implements X509TrustManager 
    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException 

    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException 

    @Override
    public X509Certificate[] getAcceptedIssuers() 
        return null;
    

假设域提供来自相对标准的提供商的证书,理想情况下,开箱即用的HttpsURLConnection 应该可以正常工作。由于它不适用于您的域,因此我们可以将其配置为信任所有内容。生产不好,但也许可以让你暂时继续。

【讨论】:

trackobot.com 仍然无法正常工作。但是以前不工作的另一个网站现在似乎工作得很好。 trackobot 似乎没有提供证书的标准,而其他站点确实有。但是,trackobot 如何在 Chrome 上工作。你可以解释吗?请。非常感谢。 @oriel 试试我更新的代码,这可能需要你稍微调整一下才能让它运行和编译。 是的,它有效!我需要阅读并理解你在那里做了什么。非常感谢!!

以上是关于Java - 收到致命警报:handshake_failure的主要内容,如果未能解决你的问题,请参考以下文章

SSLHandshakeException:收到致命警报:Java 6 -> 8 升级后的握手失败

Java8、JBoss AS5、SSLException:“收到致命警报:handshake_failure”

java.lang.RuntimeException:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

如何在 java7 中处理异常“javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure”

无法通过 java 代码连接到服务器。获取 javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

信任 Websocket SSL - 收到致命警报:handshake_failure