如何在Runscope测试中用私钥签名请求?



我正在尝试添加Runscope测试来验证我发送的请求的签名。在第一步中,我想签名此请求,然后将其发送到将要验证它的服务。

我知道我可以在Runscope中添加脚本,并且我可以使用CryptoJS来签署请求。然而,CryptoJS的文档不是很有帮助,我未能签署我的请求;

我用Crypto Postman lib在Postman中做了类似的事情,代码是:

function encryptSignature(signingMetadata) {
eval(pm.globals.get('pmlib_code'));
var encryptedSignature = new pmlib.rs.KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
encryptedSignature.init(config.privateKey)
var hash2 = encryptedSignature.signString(signingMetadata)
const signedEncoded = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hash2));
return signedEncoded;
}

尝试在Runscope中做类似的事情,我提出了以下代码:

function encryptSignature(signingMetadata) {
var hash = CryptoJS.SHA256withRSA(signingMetadata, config.privateKey);
var signedEncoded = hash.toString(CryptoJS.enc.Base64);
return signedEncoded;
}

但是得到了未定义的错误,我假设是CryptoJS;

我使用了一些在线JS编译器,当我导入

import sha256 from 'crypto-js/sha256';
import Base64 from 'crypto-js/enc-base64';

和重构代码:

var signedEncoded = Base64.stringify(sha256(signingMetadata, config.privateKey));

它编译并执行某种签名,但是签名看起来不正确(它太短了)

有人在Runscope中成功地做过这个吗?我希望你能给我一些建议;

谢谢你,

正如@Topaco提到的,CryptoJS不支持RSA加密。

您可以使用jsrsign和CryptoJS库生成签名,但是由于Runscope的限制,要使其工作很棘手。下面的代码片段正在生成签名:

var signature = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
signature.init(privateKey); // just key as a string
var hash = signature.signString("string to sign");
const encodedSignature = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hash));
return encodedSignature;

,但为了使其工作,请执行以下操作:

  1. jsrsasign的repo,导入jsrsasign-rsa-min.jskeyutil-1.0.js作为一个Runscope脚本库/代码片段(可选择合并这些文件在一起)
  2. 去掉箭头函数(Runscope限制)
  3. 删除所有window引用(Runscope限制)。jsrsign使用它来检测旧的浏览器——在这种情况下没有必要,因为我们只在Runscope环境中运行这个脚本。
  4. (可选)从jsrsasign-rsa-min.js文件中删除CryptoJS,因为它已经在Runscope环境中可用。
  5. 将上述库导入到测试

最新更新