是否启用 HTTPS 域名校验
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
美国云虚拟主机 助力出海企业低成本上云 WAF网站防火墙 为您的业务网站保驾护航
Apache JMeter 是一款功能强大且广泛应用的开源性能测试工具,支持对 Web 应用、REST/SOAP API、数据库服务等进行负载模拟和压力测试,在实际测试过程中,HTTPS 接口的 SSL/TLS 安全验证常成为阻碍测试执行的技术瓶颈——尤其是当目标系统使用自签名证书、过期证书或由非权威机构签发的证书时,JMeter 默认会因“证书不受信任”而拒绝建立连接,导致请求失败。
为确保测试流程顺畅,开发与测试人员往往需要临时绕过 SSL 证书校验机制,本文将深入解析 JMeter 中忽略 SSL 证书的多种实现方式,阐明其底层原理,并重点探讨相关安全风险及应对策略,帮助团队在效率与安全之间取得平衡。
为何需要忽略 SSL 证书?
HTTPS 协议通过 SSL/TLS 加密保障客户端与服务器之间的通信安全,其中数字证书是身份认证的核心组件,当 JMeter 发起 HTTPS 请求时,Java 虚拟机会自动执行完整的证书链验证流程,包括但不限于:
- 验证证书是否由可信的证书颁发机构(CA)签发;
- 检查证书是否处于有效期内;
- 确认域名与证书中的 CN 或 SAN 字段匹配;
- 判断是否存在吊销记录(CRL/OCSP)。
一旦上述任一环节校验失败,SSL 握手即告中断,测试脚本无法继续执行。
以下几种典型场景中,开发者可能不得不选择忽略证书验证:
-
测试环境采用自签名证书
内部系统、微服务架构或 DevOps 流水线中的测试实例常出于成本或部署便捷性考虑,使用自行生成的自签名证书,而非购买公共 CA 签发的证书。 -
证书已过期或配置错误
在快速迭代的开发周期中,证书更新容易被遗漏,特别是在多环境并行运行的情况下,极易出现“证书过期”问题。 -
中间人代理调试需求
使用 Fiddler、Charles 或 mitmproxy 等抓包工具进行流量分析时,这些工具会动态生成代理证书并插入到通信链路中,若 JMeter 所依赖的 JVM 不信任该代理根证书,则会导致 HTTPS 流量拦截失败。 -
快速验证接口连通性
在非生产环境中,为了快速验证 API 是否可达或响应格式是否正确,可暂时跳过严格的证书检查以缩短调试时间。
尽管上述情况具有现实合理性,但必须明确:禁用 SSL 证书验证本质上是一种削弱安全性的行为,仅应在受控、隔离的测试环境中谨慎使用,绝不可应用于生产或准生产系统。
JMeter 忽略 SSL 证书的三种主流方法
通过 JVM 参数全局控制(推荐方案)
最直接且广泛适用的方式是在启动 JMeter 时传递特定的 Java 系统属性(JVM 参数),强制 JVM 忽略证书信任链验证。
操作步骤如下:
-
进入 JMeter 安装目录下的
bin
文件夹; -
编辑启动脚本:
- Windows 用户修改
jmeter.bat
- Linux/macOS 用户修改
jmeter.sh
- Windows 用户修改
-
在
java
启动命令前添加以下关键参数:
-Djavax.net.ssl.trustStore="" -Djavax.net.ssl.trustStorePassword="" -Dhttps.protocols=TLSv1.2,TLSv1.3 -Dsun.security.ssl.allowUnsafeRenegotiation=true
✅ 说明:
设置空的信任库(trustStore)会使 JVM 缺少可信 CA 列表,从而默认接受任何服务器证书,虽然这并非真正意义上的“忽略验证”,但在实践中等效于关闭证书校验。
更彻底的绕过方式(高级用户)
对于希望完全绕过所有 SSL 安全校验的场景,还可结合自定义 TrustManager
实现类,在 JVM 启动时加载无条件信任所有证书的逻辑。
-javaagent:ssl-bypass-agent.jar
此类第三方插桩工具(如基于 ByteBuddy 或 ASM 的 SSL Bypass Agent)可在字节码层面拦截 X509TrustManager.checkServerTrusted()
方法调用,实现无缝绕过。
⚠️ 注意:此类工具虽高效,但存在兼容性问题,需谨慎评估稳定性。
修改 jmeter.properties 配置文件(辅助手段)
JMeter 提供丰富的配置选项,可通过编辑 jmeter/bin/jmeter.properties
文件调整部分网络行为,间接提升 HTTPS 兼容性。
关键配置项示例:
# 明确指定支持的 TLS 版本 https.default.protocol=TLSv1.2 https.socket.protocols=TLSv1.2,TLSv1.3 # 减少空闲连接关闭后的重连异常 httpclient4.validate_after_inactivity=0 # 可选:关闭主机名验证(需配合 JVM 参数) # https.disable.hostname.verification=true
📌 注意:标准版 JMeter 并不原生支持
HTTPS.disable.hostname.verification
参数,除非使用定制构建版本或启用某些扩展插件(如 HTTP Client 4.x 相关模块),仅靠属性文件通常不足以完全跳过证书验证,应作为 JVM 参数的补充手段。
使用 JSR223 PreProcessor 编写脚本动态处理(灵活高级用法)
对于具备编程能力的测试工程师,可在测试计划中插入 Groovy 脚本(推荐替代已废弃的 BeanShell),在运行时动态注册一个“信任所有证书”的 SSLContext
。
示例代码(Groovy):
import javax.net.ssl.* import java.security.cert.X509Certificate // 创建无条件信任所有证书的 TrustManager def trustAllCerts = [ getAcceptedIssuers: { [] as X509Certificate[] }, checkClientTrusted: { certs, authType -> }, checkServerTrusted: { certs, authType -> } ] as X509TrustManager // 初始化 SSLContext def sc = SSLContext.getInstance("TLS") sc.init(null, [trustAllCerts] as TrustManager[], new SecureRandom()) // 替换全局 SSLSocketFactory 和 HostnameVerifier HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()) HttpsURLConnection.setDefaultHostnameVerifier({ hostname, session -> true } as HostnameVerifier) log.info("【SSL】已启用无条件信任模式(仅限测试环境)")
使用方式:
- 在测试计划的线程组下添加 JSR223 PreProcessor;
- 将上述脚本粘贴至编辑区,语言选择 Groovy;
- 放置于所有 HTTPS 请求之前执行。
✅ 优势:
- 精细化控制作用范围(可按线程组或控制器启用);
- 支持动态判断条件(如仅对特定域名绕过验证);
- 易于集成日志输出与审计功能。
❌ 缺点:
- 脚本性能开销较大,高并发下可能影响测试结果真实性;
- 若未妥善管理,易造成误用或遗留安全隐患。
安全风险警示与最佳实践建议
尽管忽略 SSL 证书能解决短期连接问题,但其背后潜藏严重安全威胁,必须引起高度重视。
🔴 主要安全风险
风险类型 | 说明 |
---|---|
中间人攻击(MITM) | 攻击者可伪造服务器证书,窃听或篡改加密流量,获取敏感数据(如 Token、Cookie、账号密码)。 |
数据泄露风险 | 即使传输过程加密,若通道本身不可信,加密强度再高也形同虚设。 |
合规性违规 | 在金融、医疗、政务等行业,绕过 SSL 验证违反《网络安全法》《GDPR》《HIPAA》等法规要求。 |
配置蔓延风险 | 临时设置未及时清理,可能导致后续误用于更高权限环境。 |
✅ 安全最佳实践建议
为兼顾测试效率与系统安全,请遵循以下原则:
-
严格限定使用范围
忽略 SSL 验证的操作仅允许在本地开发或隔离测试环境中使用,严禁出现在预发布、UAT 或生产环境中。 -
优先导入证书而非关闭验证
更安全的做法是将自签名证书或代理 CA 证书导入 JDK 的信任库(cacerts
):keytool -importcert -alias my-test-ca \ -