如何使用jsrsasign获取证书以验证我的RSA数字签名?

3

我正在使用jsrsasign,之前我生成了RSA公钥和私钥。我使用以下代码生成了一个签名。

var key = new RSAKey();
key.readPrivateKeyFromPEMString($("#private")[0].value); // "private" is a textarea containing the PEM encoded private key.
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA", "prov": "cryptojs/jsrsa"});
sig.initSign(key);
sig.updateString('message');
var sigValueHex = sig.sign();

这产生了预期的十六进制签名。jsrsasign文档提供以下代码来验证签名。
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA", "prov": "cryptojs/jsrsa"});
sig.initVerifyByCertificatePEM("-----BEGIN CERTIFICATE-----(snip)");
sig.updateString('message');
var isValid = sig.verify(sigValueHex);

我的问题是我没有证书来验证。 sig.sign() 只提供签名,没有证书。还有一个看起来很有前途的方法是 sig.initVerifyByPublicKey(RSAKey)。但是,RSAKey 只有获取私钥而不是公钥的方法。
所以,我的问题是如何获取这个证书?如果我不能,如何从我的公钥获得 RSAKey 对象?如果我不能做到那样,是否有更好的方法来使用 JavaScript 进行数字签名?
我正在使用 jsrsasign 和 jQuery。http://kjur.github.io/jsrsasign/ 如果我正在使用的方法无法解决这个问题,是否有更好的方法?我的主要目标是能够向服务器发送消息,并确保消息未被篡改并且来自正确的位置。SSL 在此处不可用。消息不需要加密,只需要保护。

相关文章:http://www.matasano.com/articles/javascript-cryptography/请仔细阅读上述文章,了解有关JavaScript加密的内容。 - ntoskrnl
2个回答

2
您可以使用openssl生成X.509自签名密钥/证书对。
openssl req -newkey rsa:4096 -x509 -nodes -keyout key.pem -out certificate.pem

certificate.pem上传到服务器,并在客户端使用key.pem对消息进行签名。

可以在服务器上验证消息和签名。

以下是使用jsrsasign的示例代码:

const jsrsasign = require("jsrsasign");
const fs = require('fs');

// sign
let key = fs.readFileSync("./key.pem", "utf-8");
let sig = new jsrsasign.KJUR.crypto.Signature({"alg": "SHA1withRSA"});
sig.init(key);
sig.updateString("message");
const signature = sig.sign();

// verify
let certificate = fs.readFileSync("./certificate.pem", "utf-8");
let ver = new jsrsasign.KJUR.crypto.Signature({"alg": "SHA1withRSA"});
ver.init(certificate);
ver.updateString("message");
ver.verify(signature); // return true

供您参考。

2

你可以使用KEYUTIL.getKey(param)来创建公钥,其中“param”可以是包含证书或公钥的字符串。

这里是该方法的文档

示例:

    var publicKey = KEYUTIL.getKey(publicKeyString);
    var sig = new r.Signature({"alg": "SHA256withRSA", "prov": "cryptojs/jsrsa"});
    sig.initVerifyByPublicKey(publicKey);
    sig.updateString(message);
    var isValid = sig.verify(signature);

希望这能帮到您。

谢谢你的建议。需要引用KEYUTIL模块。我加了这个变量 KEYUTIL = require("cloud/jsrsasign-4.7.0/keyutil-1.0.js"); 但是似乎也不起作用,说KEYUTIL没有getKey方法,这是不正确的。 - Leonardo Amigoni
这对我很有用。jsrsasign文档的主要问题是缺乏像这样的迷你示例。 - Cheeso
@LeonardoAmigoni - 你不需要使用 require 来加载 KEYUTIL 模块,只需将其加载即可。原始问题是关于基于浏览器的签名的。可以通过正常的脚本标记来加载 KEYUTIL 模块。 - Cheeso
r是什么?他的问题中没有那个变量。 - roberto tomás

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接