K6向特定Endpoint发起Get请求时报x509证书错误的问题咨询
K6发起GET请求时触发TLS证书校验拦截的问题
作为K6新手,最初需求是通过K6发送GET请求,验证目标API的可用性。
执行测试脚本时会触发终止类的警告信息,初步判断报错逻辑和K6底层依赖的Go语言机制相关。
最终目标是顺利向目标endpoint发送GET请求,同时排查自身脚本是否存在操作失误,梳理其他可落地的可行方案。
原始测试脚本
import http from "k6/http"; import { check } from "k6"; export default function () { var url = "https://endpoint.example.to.cloud/api/reports/v1/SMOKETESTC6KP6NWX"; var headerParam = { headers: { "Content-Type": "application/json", }, }; const response = http.get(url, headerParam); check(response, { "Response status reciving a 200 response ": (r) => r.status === 200, }); let body = JSON.parse(response.body); }
运行时输出的报错
WARN[0000] Request Failed error="Get \"https://endpoint.example.to.cloud/api/reports/v1/SMOKETESTC6KP6NWX\": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0"
对照验证结果
将目标endpoint替换为公开Mock接口地址时,脚本可正常运行无报错,替换的代码片段参考:
var url = "https://run.mocky.io/v3/16fa8113-57e0-4e47-99b9-b5c55da93d71";
已验证的本地可行操作
- 给脚本的全局配置补充客户端证书、密钥的双向TLS认证配置,片段参考:
export let options = { tlsAuth: [ { cert: open(`${__ENV.Certificate}`), key: open(`${__ENV.Key}`), }, ], };
- 执行命令时追加跳过TLS校验的参数,完整执行命令示例(注意不要把脚本路径错放到
-e参数后,-e仅用于传递键值对形式的环境变量):
k6 run -e Certificate=/home/cert/example_certification.crt -e Key=/home/cert/certification/example_key.key example.js --insecure-skip-tls-verify
补充说明:这类x509报错和脚本里的GET请求写法没有关系,根源是K6底层依赖的Go语言从1.15版本开始,默认不再兼容旧版证书的Common Name字段做域名匹配。目标服务端的证书没有按新版规范添加SAN(主题备用名称)域名标识,才触发了底层的安全拦截。
如果目标端暂时没法调整证书配置,除了加--insecure-skip-tls-verify跳过全量TLS校验之外,还可以在执行命令时通过环境变量开启旧版证书的兼容逻辑,保留必要的TLS校验强度,方案更稳妥,命令参考:GODEBUG=x509ignoreCN=0 k6 run 你的脚本文件路径.js
内容的提问来源于stack exchange,提问作者Martin Jönsson
相关产品推荐
相关产品推荐

