公司接口sign值采用RSA签名,压力测试需要Jmeter模拟sign值,研发时间紧任务重无法给提供jar包,所以只能自己动手丰衣足食。
一、首先扒研发代码
我们公司测试有查看代码权限,把接口工程clone下来,找到签名和解签的java类。发现方法不适用于封装jar提供给Jmeter使用,所以需要改造。
二、复制粘贴修改
主要方法上代码:
public static String sign(byte[] priKeyText, String plainText) throws Exception {
try {
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(priKeyText));
KeyFactory keyf = KeyFactory.getInstance("RSA");
PrivateKey prikey = keyf.generatePrivate(priPKCS8);
// 用私钥对信息生成数字签名
Signature signet = Signature.getInstance("");
signet.initSign(prikey);
signet.update(plainText.getBytes("UTF-8"));
byte [] signb=signet.sign();
String signStr=new BASE64Encoder().encode(signb);
signStr=signStr.replaceAll("\r|\n", "%0A").replaceAll("/", "%2F").replaceAll("\\+", "%2B").replaceAll("\\=", "%3D");
return signStr;
} catch (Exception e) {
throw e;
}
}
网上百度方法一堆,为啥把代码贴一下呢,是因为这里后面调用jar包时踩的坑。
三、写完封jar包
至于怎么打jar包,万能的百度。
image.png image.png image.png image.png image.png
四、Jmeter测试
Jmeter如何调用jar,自行百度
Jmeter使用遇到的坑。
a.sign正常生成了,但是Jmeter发送请求一直请求失败。
分享原因及解决方法:
签名与实际fiddler抓包的签名做对比
jmeter生成签名格式
uDOMiWd…………
fiddler抓包查看SyntaxView签名格式
j%2FODVjsATH9HI0rbIZsPWdZwRUhUS7l5…………
解决办法,java文件,将"空格"、“/”、“+”、“=”替换
signStr=signStr.replaceAll("\r|\n", "%0A").replaceAll("/", "%2F").replaceAll("\\+", "%2B").replaceAll("\\=", "%3D");
解决后重新打包,即可正常发送请求。
b.解决非法链接后,循环发送请求,第一个请求发送成功,其它请求均提示为重复请求。
BeanShell sampler,在此生成随机数和时间戳,加签,然后将参数传给url。解决重复问题。
import signtest.SignUtilJar;
import java.util.UUID;
String version=vars.get("version");
String caller_type= vars.get("caller_type");
String nonce="";
String timestamp= "";
nonce = UUID.randomUUID().toString();
long time = System.currentTimeMillis();
timestamp=time+"";
String sign ="";
SignUtilJar signUtilJar = new SignUtilJar();
sign=signUtilJar.getSign(version,caller_type,nonce,timestamp);
vars.put("sign",sign);
vars.put("nonce",nonce);
vars.put("timestamp",timestamp);
网友评论