无法发送 Https 请求(在 SSLv3 中运行 Tomcat 8.5)

Posted

技术标签:

【中文标题】无法发送 Https 请求(在 SSLv3 中运行 Tomcat 8.5)【英文标题】:Unable to send Https requests (Running Tomcat 8.5 in SSLv3) 【发布时间】:2019-06-05 00:25:19 【问题描述】:

我正在使用 Nio 协议和 Java 1.8 在 tomcat v8.5 server.xml 文件中设置 SSLv3。当我从 IE 发出请求时,我得到了响应,但是通过 java 代码我得到了如下异常。

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

我更新了 users/db8/Appdata/LocalLow/sun/java/deployment/deployment.properties (deployment.security.SSLv3=true) 中的 development.properties,并从 java.security 文件中删除了 SSLv3。我在 Internet Explorer 中启用了 sslv3。

    server.xml 
    <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
    port="8443" maxThreads="200" scheme="https" secure="true" 
    SSLEnabled="true" keystoreFile="keystore.jks" keystorePass="changeit" 
    clientAuth="false" sslProtocol="SSLv3" />

java code

import java.net.URL;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;
import java.net.HttpURLConnection;

public class JavaHttpsExample

public static void main(String[] args) throws Exception 
    String certificatesTrustStorePath = "keystore.jks";
    System.setProperty("javax.net.ssl.trustStore",
    certificatesTrustStorePath);
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    System.setProperty("https.protocols", "SSLv3");
    System.setProperty("jdk.tls.client.protocols", "SSLv3");
    String httpsURL = "https://ip:8443/test/getData";
    URL myUrl = new URL(httpsURL);
    HttpsURLConnection conn = (HttpsURLConnection)myUrl.openConnection();
    try       
    InputStream is = conn.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String inputLine;
    while ((inputLine = br.readLine()) != null) 
    System.out.println(inputLine);
    
    br.close();
     catch(Exception e)
    System.out.println("exxception"+e);
        
    
     

我在更新 debug = all 后添加结果

允许不安全的重新协商:false 允许遗留问候消息:true 是否是初始握手:true 是否安全重新协商:错误 main, setSoTimeout(0) 调用 %% 没有缓存的客户端会话 更新握手状态:client_hello[1] 即将到来的握手状态:server_hello[2] *** 客户端你好,SSLv3 RandomCookie: GMT: 1547297410 字节 = 170, 53, 106, 27, 73, 55, 4, 39, 195, 152, 66, 1, 124, 244, 6, 114, 106, 181, 46, 183, 184, 202、56、105、225、158、210、195 会话 ID: 密码套件:[TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 压缩方法:0 扩展椭圆曲线,曲线名称:secp256r1, secp384r1, secp521r1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, secp256k1 扩展 ec_point_formats,格式:[未压缩]


主要,写入:SSLv3 握手,长度 = 107 主要,阅读:SSLv3 警报,长度 = 2 主要,RECV TLSv1.2 ALERT:致命,handshake_failure 主要的,称为 closeSocket() 主要,处理异常:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure 异常javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

【问题讨论】:

使用选项 -Djavax.net.debug=all 运行您的应用程序,您可以了解 ssl 握手失败的原因。也不要使用System.getProperty(),而是提供所有 ssl 配置。 java命令行中的详细信息。 @RameshSubramanian 我在更新 debug = all 后将结果添加到我的问题中。 【参考方案1】:

似乎您的服务器支持 TLS Cipher Suites ,但您尝试使用 SSLv3。您能否按照链接 https://dzone.com/articles/troubleshooting-javaxnetsslsslhandshakeexception-r 的建议使用 -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 运行您的程序,该链接解释了如何解决 SSL 握手失败。

【讨论】:

以上是关于无法发送 Https 请求(在 SSLv3 中运行 Tomcat 8.5)的主要内容,如果未能解决你的问题,请参考以下文章

带有Godaddy错误的事件SSL:ssl.SSLError:[SSL:SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3警报证书未知(_ssl.c:1051)

Kivy 中的 HTTPS 请求

无法在运行发布颤动时发布 https 请求

AWS S3 禁用 SSLv3 支持

无法在soapclient和https中发送请求

PHP Curl(带有 NSS)在连接到 https 时可能使用 SSLv3 而不是 TLS