首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HTTPS通信失败,jdk 1.6 (32位客户端)与jdk 1.8 (64位)服务器: READ: unk-3.3警报,length =2

HTTPS通信失败,jdk 1.6 (32位客户端)与jdk 1.8 (64位)服务器: READ: unk-3.3警报,length =2
EN

Stack Overflow用户
提问于 2017-01-30 13:05:15
回答 1查看 1.9K关注 0票数 2

这是我关于堆叠溢出的第一个问题。我正在尝试两只猫之间的HTTPS通讯:

  1. 客户端Tomcat,使用JDK1.6 32位。
  2. 服务器Tomcat,使用JDK1.8 64位。

HTTPs请求的客户端代码:

代码语言:javascript
运行
复制
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。

但仍然无法获得骑乘的错误。我已经花了很多时间了。请帮我解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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通信。

代码语言:javascript
运行
复制
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格式握手消息。

我希望这能帮助面对同样问题的人,

谢谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41936661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档