
jmeter 在 java 8+ 环境下默认禁用 tls 1.0,导致连接仅支持 tls 1.0 的遗留服务时抛出 sslhandshakeexception;本文详解如何通过修改 jvm 安全配置安全启用 tls 1.0(不降级 jdk)。
jmeter 在 java 8+ 环境下默认禁用 tls 1.0,导致连接仅支持 tls 1.0 的遗留服务时抛出 sslhandshakeexception;本文详解如何通过修改 jvm 安全配置安全启用 tls 1.0(不降级 jdk)。
当使用 JMeter 5.4.2(兼容 JDK 8)测试老旧 SOAP 服务时,若服务端仅支持 TLS 1.0,而客户端(JMeter/JVM)拒绝该协议版本,便会触发典型的握手异常:
javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted by client preferences [TLS12]
该错误并非 JMeter 自身限制,而是底层 JVM(尤其是较新 JDK 8u292+ 或 OpenJDK 8/11+ 发行版)在 java.security 文件中默认禁用了 TLS 1.0 —— 即使你未手动添加,部分厂商 JDK(如 Microsoft Build of OpenJDK、Amazon Corretto、Adoptium)已将 TLSv1 列入 jdk.tls.disabledAlgorithms 黑名单。
✅ 正确解决路径:精准启用 TLS 1.0(推荐)
请勿降级 JDK(如退回 JDK 7),也不建议全局开启不安全算法。应仅针对当前测试场景,在最小作用域内启用 TLS 1.0:
步骤 1:定位并编辑 java.security 文件
该文件位于 JDK 安装目录下的:
$JAVA_HOME/jre/lib/security/java.security(JDK 8)或
$JAVA_HOME/conf/security/java.security(JDK 9+)
打开后查找以下行:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, ...
✅ 安全修改方式(推荐):
仅移除 TLSv1(注意保留逗号与空格格式),例如改为:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves⚠️ 注意:TLSv1.1 建议仍保留禁用(PCI DSS 合规要求),除非服务端明确仅支持 TLS 1.1。
步骤 2:强制 JMeter 使用修改后的 JVM 配置
确保 JMeter 启动时加载了更新后的 java.security。可通过以下任一方式验证生效:
-
启动 JMeter 前设置环境变量(推荐用于隔离测试):
export JAVA_HOME=/path/to/your/jdk8 jmeter -v # 查看启动日志中 JVM 参数及 security provider 信息
-
或在 jmeter.bat / jmeter.sh 中显式指定安全属性(更可控):
JVM_ARGS="-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2"
? 补充说明:-Djdk.tls.client.protocols 是 JVM 级别白名单,优先级高于 disabledAlgorithms,可作为兜底方案(但需确保 TLSv1 未被完全禁用)。
步骤 3:JMeter 层面补充验证(可选)
在 jmeter.properties 中确认 HTTP 默认协议未被覆盖:
# 确保此项未被设为 false 或注释掉(默认即启用 TLS) https.default.protocol=TLSv1.2 # 若需强制某线程组使用 TLSv1,可在 HTTP 请求采样器中添加: # 【高级】→【SSL 协议】下拉选择 "TLS"(JMeter 5.4+ 会映射为 TLSv1)
⚠️ 重要注意事项
- 安全性权衡:TLS 1.0 已被 NIST、PCI DSS 等标准弃用,仅限临时测试或无法升级的内部遗留系统。生产环境务必推动服务端升级至 TLS 1.2+。
- 不要全局启用:避免在 java.security 中删除整个 jdk.tls.disabledAlgorithms 行,这将极大削弱 JVM 安全基线。
- OpenJDK 厂商差异:Microsoft、Amazon、Eclipse Temurin 等 OpenJDK 构建版本普遍默认禁用 TLSv1/TLSv1.1;Oracle JDK 8u292+ 也已同步此策略。
- JMeter 版本无关性:该问题本质是 JVM 行为,与 JMeter 5.4.2/5.5/5.6 均无关;只要底层 JDK 启用了 TLS 1.0 禁用策略,就会触发。
✅ 总结
| 场景 | 推荐操作 |
|---|---|
| ✅ 临时测试 TLS 1.0 服务 | 编辑 java.security,从 jdk.tls.disabledAlgorithms 中移除 TLSv1 |
| ✅ 多环境隔离 | 使用独立 JDK 实例 + 修改其 java.security,避免影响其他应用 |
| ❌ 不推荐 | 降级 JDK、全局取消所有禁用算法、在代码中硬编码协议(JMeter 不支持) |
完成配置后重启 JMeter,重放请求即可成功建立 TLS 1.0 握手。记住:技术妥协应有边界,每一次对旧协议的启用,都应同步驱动服务端的安全升级计划。










