我正在使用 Nio 协议(protocol)和 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 是否安全重新协商:false main, setSoTimeout(0) 调用 %% 没有缓存的客户端 session 更新握手状态:client_hello[1] 即将到来的握手状态:server_hello[2] *** ClientHello, 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 } session 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_2 56_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_RENEGOTI ATION_INFO_SCSV] 压缩方法:{ 0 } 扩展 elliptic_curves,曲线名称:{secp256r1, secp384r1, secp521r1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, secp256k1} 扩展 ec_point_formats,格式:[未压缩]
主要,写入:SSLv3 握手,长度 = 107 主要,阅读:SSLv3 警报,长度 = 2 主要,RECV TLSv1.2 警报:致命,握手失败 主要,称为 closeSocket() 主要,处理异常:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure exxceptionjavax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
最佳答案
您的服务器似乎支持 TLS Cipher Suites ,但您尝试使用 SSLv3
。您可以按照链接 https://dzone.com/articles/troubleshooting-javaxnetsslsslhandshakeexception-r 的建议使用 -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
运行您的程序吗?其中解释了如何对 SSL 握手失败进行故障排除。
关于java - 无法发送 Https 请求(在 SSLv3 中运行 Tomcat 8.5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54123512/