博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSL/TLS的Handshake过程与javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure异常
阅读量:4178 次
发布时间:2019-05-26

本文共 938 字,大约阅读时间需要 3 分钟。

一.SSL/TLS的Handshake过程

在SSL/TLS的Handshake过程中,客户端与服务器之间需要交换参数,具体过程如下:

  1. 客户端提供其所支持的各种cipher suites(包含加密算法和Hash函数)
  2. 服务器从中选择自己也支持的cipher suite,并通知客户端,表明两者将以此进行数据传输
  3. 服务器同时将自己的数字证书(包括服务器名称、CA和公钥)作为标识符发给客户端
  4. 客户端向CA确认服务器的数字证书的有效性
  5. 客户端生成会话密钥(客户端与服务器之间后续的数据传输将使用此会话密钥)
  • 使用服务器的公钥加密会话密钥发送给服务器
  • 或者客户端也可以使用DH密钥交换

二.handshake_failure异常分析

在客户端与服务器之间进行SSL/TLS通信的过程中,常常发生如下异常:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

首先,该异常发生的时机,是在客户端与服务器之间进行的Handshake的过程中,客户端与服务器之间的有效数据传输还没有开始。

原因一:针对上述Handshake的过程,该异常往往发生在第4步,即客户端得到服务器的数字证书时,向CA验证证书有效性时。

客户端在试图向可信CA进行验证时,发现服务器的数字证书所引用的CA,没有出现在客户端的trust store中。

原因二:此外,该异常也可能是由于客户端与服务器所使用的SSL/TLS版本不一致。服务器使用的TLS版本高,而客户端支持的TLS版本低。

Java对SSL/TLS的默认支持如下:

Java版本 默认SSL/TLS版本
Java8 TLSv1.2
Java7 TLSv1
Java6 TLSv1

如果服务器使用TLSv1.2,而客户端Java7(默认使用TLSV1),则会抛出该异常。

这时,可以为客户端设置JVM参数如下,以提高客户端的TLS版本:

-Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1.0,SSLv3,SSLv2Hello

上述两种原因,都可以通过升级JDK到1.8解决,因为Java 8默认支持TLSv1.2版本。

转载地址:http://qtlai.baihongyu.com/

你可能感兴趣的文章
JAVA常用基础类
查看>>
简述Java异常处理
查看>>
简述Java集合框架
查看>>
jQuery+ajax实现省市区(县)下拉框三级联动
查看>>
Spring中的AOP 面向切面编程
查看>>
简述Spring中的JDBC框架
查看>>
MyBatis 动态SQL
查看>>
Spring MVC体系结构和处理请求控制器
查看>>
浏览器内核的整理稿
查看>>
暴力搜索内存空间获得API的线性地址
查看>>
CTF编码
查看>>
万能密码原理和总结
查看>>
缓冲区溢出学习
查看>>
Excel高级使用技巧
查看>>
速算,以后留着教孩子
查看>>
让你变成ps高手
查看>>
在可执行jar中动态载入第三方jar(转贴)
查看>>
考虑体积重量的01背包问题—基于遗传算法
查看>>
K-means 聚类算法
查看>>
带约束的K-means聚类算法
查看>>