这是我关于堆叠溢出的第一个问题。我正在尝试两只猫之间的HTTPS通讯:
HTTPs请求的客户端代码:
HttpClient hc = new HttpClient();
hc.startSession(monitAppURL);
int code = hc.executeMethod(poster);
例外我得到:
收到致命警报: handshake_failure
我从JVM开始使用-Djavax.net.debug=ssl:handshake:verbose
获得更详细的异常。
SecureRandom的触发种子 干播SecureRandom 允许不安全的重新谈判:对 允许遗留hello消息: true 第一次握手:真 是安全的重新谈判:是真的 监控服务@dealy::nap 30:30,调用setSoTimeout(0) 监控服务@dealy::nap 30:30,调用setSoTimeout(0) %%未缓存客户端会话 * ClientHello,TLSv1 RandomCookie: GMT: 1468994533字节={ 100,134,165,203,220,40,175,72,89,189,99,104,208,177,19,59,234,210,59,1,57,254,73,155,253,82,102,221 }会话ID:{} 密码套件: SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WIT _AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CB _SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE DSS_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_S A,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_DSS_EXPORT_W TH_DES40_CBC_SHA,TLS_EMPTY_RENEGOTIATION_INFO_SCSV 压缩方法:{0} *监控服务@ TLSv1::nap 30::30,写:TLSv1握手,长度= 75 监控服务@dealy::nap 30:30,写: SSLv2客户端你好消息,length = 101 监控服务@ READ::nap 30:30,阅读:未知-3.3警报,长度=2 监控服务@ RECV::nap 30:30,RECV TLSv1警报: Handshake_failure 监控服务@dealy::nap 30:30,名为closeSocket()监视服务 @dealy::nap 30::30,处理异常: javax.net.ssl.SSLHan shakeException:接收到致命警报: handshake_failure
我已经用set JAVA_OPTS="-Dhttps.protocols="TLSv1" -Djdk.tls.client.protocols="TLSv1" -Dcom.sun.net.ssl.checkRevocation=false -Ddeployment.security.TLSv1=true -Djavax.net.debug=ssl:handshake:verbose -Dsun.security.ssl.allowUnsafeRenegotiation=true -Djdk.tls.enableRC4CipherSuites=true -Ddeployment.security.TLSv1=true -Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
启动了JVM。
但仍然无法获得骑乘的错误。我已经花了很多时间了。请帮我解决这个问题。
发布于 2017-02-01 09:38:50
我找到了解决我的问题的办法,1.发生了什么事?默认情况下,Java6使用SSlv2Client Hello进行握手,尽管它使用的是TLSv1 protocol.The握手消息格式是sslv2Client hello
@dealy::nap 30:30,写: SSLv2 client hello message,length=101
我的服务器正在使用java 8,由于安全原因禁用了SSLv3,
jdk.tls.disabledAlgorithms=SSLv3
这导致了我的握手消息失败,因为我的客户端正在发送sslv2Client hello消息,尽管TLSv1协议被选择用于通信,.Its报告为bug:
https://serverfault.com/questions/637880/disabling-sslv3-but-still-supporting-sslv2hello-in-apache
如果禁用jvm中的Sslv3,也会禁用sslv2Client Hello支持。
2.我做了什么?默认情况下,apache总是采用httpClient原始协议栈进行通信。这就是为什么我的jvm参数不适用于httpclient的原因。
因此,我通过添加以下代码重写了httpclient通信。
SSLContext sslContext = SSLContexts.custom()
.useTLS()
.build();
SSLConnectionSocketFactory f = new SSLConnectionSocketFactory(
sslContext,
new String[]{"TLSv1"},
null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpClient hc = HttpClients.custom()
.setSSLSocketFactory(f)
.build();
最后,Apache启动了用于通信的TLSv1格式握手消息。
我希望这能帮助面对同样问题的人,
谢谢。
https://stackoverflow.com/questions/41936661
复制相似问题