首页 > 解决方案 > JMeter javax.net.ssl.SSLHandshakeException 间歇性

问题描述

我们正在运行一个 JMeter 脚本,它将 json 数据发布到内部 https 端点。但是在运行脚本时,我们会间歇性地收到 javax.net.ssl.SSLHandshakeException(大约 100 次调用中的 3 次)。

此问题与以下 SO 问题非常相似,但其中讨论的所有解决方案均不适用于我: javax.net.ssl.SSLHandshakeException: handshake_failure when using JMeter with SSL (JDK8)

我正在使用 JDK8 和最新的 JMeter 4.0 版。我打开了 ssl 调试,从 ClientHello 和 ServerHello 消息中,看起来服务器支持 TLS 1.2 和 JMeter 也支持的 TLS_RSA_WITH_AES_128_CBC_SHA 密码套件。

但是我在 SSL 日志中看到以下失败的 JMeter 请求:

写入:TLSv1.2 握手,长度 = 64
读取:TLSv1.2 警报,长度 = 2
RECV TLSv1.2 警报:致命,handshake_failure
%% 无效:[Session-17,TLS_RSA_WITH_AES_128_CBC_SHA]

我尝试了以下解决方案:
1. 将服务器证书添加到 jre cacerts
2. 为不受支持的密码下载本地策略 jar 并将它们复制到 jre lib 安全文件夹
3. 更新 JMeter 的 httpclient jar (4.5)
4. 在 JMeter 配置中显式启用 TLS 1.2

我使用 TestSSLServer 来测试我们服务器的 SSL 功能,这就是它返回的内容:
SSLv3:
server selection: enforce server preferences
3-- (key: RSA) RSA_WITH_RC4_128_SHA 3--
(key: RSA) RSA_WITH_AES_128_CBC_SHA 3--
(key: RSA ) RSA_WITH_AES_256_CBC_SHA 3--
(key: RSA) RSA_WITH_3DES_EDE_CBC_SHA
TLSv1.0: 同上
TLSv1.2:
服务器选择: 强制服务器首选项
3-- (key: RSA) RSA_WITH_RC4_128_SHA 3--
(key: RSA) RSA_WITH_AES_128_CBC_SHA 3--
(key: RSA) RSA_WITH_AES_256_CBC_SHA 3--
(key: RSA) RSA_WITH_3DES_EDE_CBC_SHA 3--
(key: RSA) RSA_WITH_AES_128_CBC_SHA256
3--(密钥:RSA)RSA_WITH_AES_256_CBC_SHA256

关于可能出现什么问题的任何想法?

标签: javassljmetersslhandshakeexceptionf5

解决方案


我无法真正找出确切的原因,但现在知道可能出了什么问题。按照 Dave 的建议,我打开了 SSL 调试并查看了所有日志,并将失败的请求与成功的请求进行了比较。

对于失败的请求,这是我在日志中看到的:

  1. 客户端发送 Hello & Server 发送 Hello
  2. 服务器发送证书和服务器你好完成
  3. 客户端密钥交换和更改密码规范
  4. 完成的
  5. 此处失败并且来自服务器的 No Change Cipher 消息,handshake_failure 错误

如您所见,服务器由于某种原因无法响应。经过一番谷歌搜索后,我偶然发现了以下有关 f5 SSL 问题的论坛。我们的服务也通过 f5。我无法确认,因为我对我们的服务器端没有太多控制权,但下面的问题看起来很相似:

https://devcentral.f5.com/questions/big-ip-proxy-ssl-121-handshake-failure-47464


推荐阅读