jmeter 5设置客户端tls证书不工作

chhkpiq4  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(502)

我挣扎了一天,但没有运气。谷歌能找到的答案很少,但往往是过时的。
我的目标是使用jmeter内置元素发送带有客户端证书的https请求。考虑一下验证客户机证书而不是密码的oauth服务器。
我知道写我自己的插件,或使用一些beanshell等,是可能的。但我搜索并发现jmeter内置了keystore配置元素,所以我决定试一试。
首先我设置了模拟服务器,https://leiyang.icu:5001/home,一个asp.net核心网站,用于验证客户端是否已发送证书。它只是接受 GET 在小路上 /home ,具有可选的查询参数 location . 如果客户端发送带有任何证书的请求,它将响应 location 值和客户端证书信息作为字符串,否则连接将中止(todo:响应一些友好消息)。
这是一个用于验证服务器的python客户端脚本:

import requests

resp = requests.get('https://leiyang.icu:5001/home',
                    # if not specify cert, connection will be aborted by the server
                    cert=('pathto/any.crt',
                          'pathto/any.key'),
                    params={'location': 'fromrequests'}
                    )
print(resp.text)

输出:
location=fromrequests证书=[subject]cn={客户端域}
[发卡机构]cn=加密无处不在dv tls ca-g1,
ou=www.digicert.com,o=digicert公司,c=us
... 还有其他几行关于证书的内容
现在,我将jmeter用作客户端的步骤如下:
使用jdk 11在我的win10上下载jmeter 5.4.1,解压缩。
在里面 bin 文件夹,
2.1编辑 system.properties 设置
javax.net.ssl.keyStore={mykeypath} javax.net.ssl.keyStorePassword={thepwd} 2.2编辑 jmeter.properties 设置 https.use.cached.ssl.context=false 启动jmeter gui,新建计划,添加 csv data set config , key store config , http request sampler , view results tree element 作为手册指南(把所有细节放在这里太长了,但我稍后会放一些运行时日志)。
运行采样器。由于证书问题,所有请求均失败(org.apache.http.nohttpresponseexception:leiyang.icu:5001未能响应)。若将服务器代码更改为不检查证书,则所有请求都会通过。
现在进行一些调查:
jmeter日志。
021-07-07 22:31:21481信息o.a.j.e.standardjmeterengine:正在运行测试!
2021-07-07 22:31:21482信息o.a.j.s.sampleevent:样本变量列表:[]
2021-07-07 22:31:21484信息o.a.j.c.keystoreconfig:使用配置密钥库(预加载:'true',startindex:0,endindex:-1,clientcertaliasvarname:'cv')
2021-07-07 22:31:21485信息o.a.j.u.SSL管理员:jmeterkeystore位置:c:/users/myname/downloads/cert/cert.p12类型pkcs12
2021-07-07 22:31:21485信息o.a.j.u.sslmanager:密钥库已创建ok
2021-07-07 22:31:21485警告o.a.j.u.sslmanager:没有提供密码,也没有gui,因此无法提示
2021-07-07 22:31:21494信息o.a.j.u.sslmanager:总共1个别名从密钥库c加载正常:/users/myname/downloads/cert/cert.p12
2021-07-07 22:31:21494信息o.a.j.g.u.jmetermenubar:setrunning(真实,本地)
2021-07-07 22:31:21524信息o.a.j.e.standardjmeterengine:起始线程组:1:线程组
2021-07-07 22:31:21524信息o.a.j.e.standardjmeterengine:为组线程组启动1个线程。
2021-07-07 22:31:21524信息o.a.j.e.standardjmeterengine:线程将继续出错
2021-07-07 22:31:21524信息o.a.j.t.threadgroup:起始线程组。。。数量=1线程=1爬升=1延迟启动=错误
2021-07-07 22:31:21525信息o.a.j.t.螺纹组:开始螺纹组编号1
2021-07-07 22:31:21526信息o.a.j.e.standardjmeterengine:所有线程组都已启动
2021-07-07 22:31:21528信息o.a.j.t.jmeterthread:线程已启动:线程组1-1
2021-07-07 22:31:21528信息o.a.j.s.fileserver:存储:t.csv
2021-07-07 22:31:21892信息o.a.j.t.jmeterthread:线程已完成:线程组1-1
2021-07-07 22:31:21892信息o.a.j.t.JMeter螺纹:螺纹加工:螺纹组1-1
2021-07-07 22:31:21893信息o.a.j.e.standardjmeterengine:通知测试监听器测试结束
2021-07-07 22:31:21893信息o.a.j.s.fileserver:close:t.csv
2021-07-07 22:31:21893信息o.a.j.c.keystoreconfig:销毁密钥库
2021-07-07 22:31:21893信息o.a.j.g.u.jmetermenubar:setrunning(错误,本地)
在key store中,我设置了 Variable name holding certificate alias 字段到 cv ,在 http sampler/parames 表1添加了参数 location=${cv} 使用与证书别名相同的变量名 cv ,及 results tree/request tab,我明白了 GET https://leiyang.icu:5001/home?location=myalias ,这意味着变量已正确分配。
我有用 keytool -v -list -storetype pkcs12 -keystore mycert.p12 要检查别名,请与jmeter变量中的别名相同( cv )
在里面 http sampler/parames/sdvanced tab,我选择了 implementation 作为 HttpClient4 .
日志不包含任何关于http客户端实际使用的证书的信息,即使给变量添加了错误的别名,日志中也不会发生任何变化。
问题是,我错过了什么吗?你能给我一些诊断建议吗?
更新:
我刚刚在JMeter4.0(java8)中尝试了完全相同的步骤,它正在工作!
所以我怀疑这是否是JMeter5(使用jdk11)的问题。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题