JMeter调用HTTPS客户端Jar方法报SunCertPathBuilderException异常

问题描述
- 使用JMeter原生Sampler发起HTTPS接口请求时,访问完全正常
- 在JSR223 PreProcessor(使用Groovy作为脚本语言)中,导入外部Jar包调用内部Java方法向同一个HTTPS地址发起请求时,抛出
sun.security.provider.certpath.SunCertPathBuilderException异常 - 报错对应的
publish model方法基于Java Rest Assured框架开发,请求目标地址和正常访问的Sampler完全一致

问题根因
JMeter原生HTTP Sampler默认使用JMeter内置的SSL上下文与证书信任存储,不会直接依赖JDK的默认证书配置。但JSR223脚本中调用的Rest Assured客户端是独立实现,不会自动继承JMeter的SSL规则,默认走JDK原生的证书链校验逻辑:当目标HTTPS服务使用自签名证书、私有CA签发证书,或者证书链不完整,对应根证书没有存入运行JMeter的JDK信任库时,就会触发证书路径构建失败的报错。
解决方法
根据你的使用场景选对应方案即可:
- 方案1:将目标服务根证书导入JDK信任库(生产/测试通用,符合安全规范)
先导出目标HTTPS服务的根CA证书,执行keytool命令将证书导入JDK的cacerts信任库:
命令执行完成后重启JMeter,Rest Assured发起请求时就能正常校验证书链。keytool -import -alias target-service-cert -file 你的根证书文件路径.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit - 方案2:Rest Assured配置跳过证书校验(仅本地测试环境使用)
如果是测试环境不需要严格校验证书,在调用Jar包方法前先给Rest Assured配置宽松HTTPS校验规则:import io.restassured.RestAssured import io.restassured.config.SSLConfig // 配置跳过HTTPS证书链校验 RestAssured.config = RestAssured.config() .sslConfig(SSLConfig.sslConfig().relaxedHTTPSValidation()) // 配置完成后再调用Jar包内的publish model方法即可正常发起请求 - 方案3:注入JMeter的SSL上下文给Rest Assured
如果需要和JMeter Sampler保持完全一致的SSL配置逻辑,可以在Groovy脚本中获取JMeter当前加载的SSLContext,直接设置给Rest Assured使用,不需要重复维护证书配置。
注意:方案2的跳过证书校验配置会关闭HTTPS证书安全校验,存在中间人攻击风险,绝对不能在生产环境、公网测试场景下使用。
内容的提问来源于stack exchange,提问作者Mani Maran
相关产品推荐
相关产品推荐

