美文网首页
Jmeter接口sign签名jar包封装及使用采坑日志

Jmeter接口sign签名jar包封装及使用采坑日志

作者: IT媛 | 来源:发表于2020-03-12 14:22 被阅读0次

    公司接口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);
    

    相关文章

      网友评论

          本文标题:Jmeter接口sign签名jar包封装及使用采坑日志

          本文链接:https://www.haomeiwen.com/subject/yskujhtx.html