SSLHandshakeException: Received fatal alert: handshake_failure

原创 2017年05月15日 18:47:02
  1. 问题出现:
    jdk版本从7升级到8之后,出现ssl异常信息:具体错误信息如下:

    这里写图片描述


  1. 问题定位
    关于ssl握手异常,网上有很多。大多数的解决方式都是修改protocols、cipherSuites、修改${JAVA_HOME}/lib/security的local_policy.jar、US_export_policy.jar或者修改jdk版本。
    在尝试了所有的方法法之后,还是握手异常。最后在启动java程序时,新增了调试参数
    -Djavax.net.debug=all
    可以开启加密协议的调试模式。
    对比握手成功和握手失败的协议报文,发现握手失败报文缺少Cipher Suites没有RC4相关的加密算法(SSL_RSA_WITH_RC4_128_SHA)。
    在查看客户端连接的代码发现,在创建SSLConnectionSocketFactory没有指定支持的protocols和Cipher Suites。导致ssl握手过程中使用了jdk8默认的ssl协议TLSv1.2,并且jdk8默认的Cipher Suites禁用了RC4算法。最终导致握手失败。
    修复代码如下:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                    sslcontext,
                    new String[]{"TLSv1","TLSv1.1","TLSv1.2"},
                    new String[]{"SSL_RSA_WITH_RC4_128_SHA"},
                    new NoopHostnameVerifier()
            );

修改之后还是握手异常!

  1. 问题再定位
    因为在从JDK 1.8.0_u60开始,默认禁止了RC4这个算法。可以在{JRE_HOME}/lib/security/java.security找到相关配置:

jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768

以及

jdk.tls.legacyAlgorithms= \
K_NULL, C_NULL, M_NULL, \
DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_anon_EXPORT, DH_DSS_EXPORT, \
DH_RSA_EXPORT, RSA_EXPORT, \
DH_anon, ECDH_anon, \
RC4_128, RC4_40, DES_CBC, DES40_CBC

  1. 问题解决

启用Java的RC4算法

方法一:
修改 {JRE_HOME}\lib\security\java.security文件如下:
这里写图片描述

方法二:
在代码中指定属性如下:

        Security.setProperty("jdk.tls.disabledAlgorithms","SSLv3, DH keySize < 768");

然后启用相关的协议和Cipher Scites。

版权声明:本文为博主原创文章,未经博主允许不得转载。

解决jdk1.8中发送邮件失败(handshake_failure)问题

暑假在家做一个类似知乎的问答型网站(代码可见:Github/wenda 喜欢的可以给个star或者自己fork然后修改,目前功能还未很完善),其中有一个站内邮件通知系统(这里简单的讲一个例子:如果用...
  • tzs_1041218129
  • tzs_1041218129
  • 2016年08月12日 22:34
  • 10682

Java SSL/TLS 安全通讯协议介绍

原文:http://www.ibm.com/developerworks/cn/java/j-lo-ssltls/ Java 的安全通讯 刘 进, 高级软件工程师 , ...
  • wangshfa
  • wangshfa
  • 2013年06月14日 17:34
  • 15266

关于无法接收消息推送问题的修改

今天解决了一下发布版消息推送证书无法收到消息推送的问题,经过一番折腾发现原来是服务器配置问题,不过也捋了一下消息推送的流程。                 之前有一次也是消息推送无法收到,用开发版...
  • decemberd
  • decemberd
  • 2013年10月09日 17:49
  • 13302

ZPush--基于netty4实现的苹果通知推送服务(APNs)Java客户端

简单说下实现苹果通知推送服务(APNs)客户端的一些要注意的地方: 使用长连接;sanbox服务器是没用的,调试时直接用“gateway.push.apple.com”域名;对于错误的Notifi...
  • hengyunabc
  • hengyunabc
  • 2014年05月10日 00:46
  • 7254

RabbitMQ学习之spring整合发送异步消息

实现使用Exchange类型为DirectExchange. routingkey的名称默认为Queue的名称。
  • tianwei7518
  • tianwei7518
  • 2014年11月08日 11:40
  • 10668

一个实际问题分析及解决之四:通过IBM的JDK建立SSL连接

接前面内容,这里主要谈我们实现一开始描述的实际的技术需求的过程。 我们在建立与服务器的SonicMQ的SSL连接时,用了第三方jar去完成握手,而该第三方包采用的是标准的Java接口方式,即...
  • laxsong
  • laxsong
  • 2016年05月08日 08:02
  • 1747

ORA-24550: signal received:这个问题的原因及解决办法

今天写了个多线程访问数据库的程序,一直运行的好好的,突然就出现了下面的问题: ORA-24550: signal received: [si_signo=11] [si_errno=0] [si_c...
  • hzhsan
  • hzhsan
  • 2013年12月07日 18:40
  • 20695

低版本JDK解决TLS冲突

场景写一个调用第三方登陆的模块,本地开发的时候使用Apache HttpClient时候,就按照一般的POST JSon数据能够正确获取返回数据,但是当部署到线上环境的时候,就报Exception i...
  • Lizo_Is_Me
  • Lizo_Is_Me
  • 2016年09月09日 20:34
  • 5289

性能测试Jmeter的使用

本次测试使用了分部署服务哈,并且tomcat的接口是从redis取数哈。 1环境 1个mysql数据库,内存1个,cpu 1核 tomcat的web服务器,内存2g,cpu 2核,部署分布式to...
  • wangqi880
  • wangqi880
  • 2017年03月17日 23:28
  • 1036

alert()实现原理的探索!(c++底层机制我也不懂啊!)

作者:貘吃馍香 链接:http://www.zhihu.com/question/20963787/answer/34123046 来源:知乎 著作权归作者所有,转载请联系作者获得授权 ...
  • qq_34986769
  • qq_34986769
  • 2016年08月09日 13:32
  • 866
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SSLHandshakeException: Received fatal alert: handshake_failure
举报原因:
原因补充:

(最多只允许输入30个字)