Node.js 使用.p12文件发送签名并使用节点加密验证进行验证

Node.js 使用.p12文件发送签名并使用节点加密验证进行验证,node.js,openssl,cryptography,Node.js,Openssl,Cryptography,我正在尝试验证从IOS应用程序对我的API的调用。我已为后端生成密钥,如下所示: openssl genrsa -aes256\ -passout pass:pass\ -out signature_private_key.pem 2048 openssl rsa \ -in signature_private_key.pem\ -passin pass:pass\ -out signature_public_key.pem\ -outform PEM\ -pubout 在节点后端,我正在验

我正在尝试验证从IOS应用程序对我的API的调用。我已为后端生成密钥,如下所示:

openssl genrsa -aes256\
-passout pass:pass\
-out signature_private_key.pem 2048

openssl rsa \
-in signature_private_key.pem\
-passin pass:pass\
-out signature_public_key.pem\
-outform PEM\
-pubout
在节点后端,我正在验证调用,如下所示:

static createSignatureString(bodyString, apiKey, timestamp) {
  const bodyHash = crypto
  .createHash("sha256")
  .update(bodyString)
  .digest("base64");
  return `${bodyHash}:${apiKey}:${timestamp}`;
}

static createSignature(string, privateKey) {
    const sign = crypto.createSign("RSA-SHA256");
    sign.write(string);
    sign.end();
    return sign.sign(privateKey, "base64");
}

static verifySignature(xMessageSignatureString, signature, publicKey) {
    const verify = crypto.createVerify("RSA-SHA256");
    verify.update(xMessageSignatureString);
    verify.end();
    return verify.verify(publicKey, new Buffer(signature, "base64"));
}

移动应用程序使用.p12文件生成签名并发送到RESTAPI。鉴于上述情况,我如何使用openssl生成一个可发送有效签名的.p12文件?

要创建PKCS12文件,您需要私钥(您拥有的)和包含匹配公钥的(X.509)证书,或者,如果适用,一系列证书,以称为“链”的匹配证书开始。您可以从CA获取此证书/链,或者OpenSSL可以创建一个自签名证书,该证书不使用链,并且许多应用程序(但不是所有应用程序)都可以接受:

 openssl req -new -x509 -key privatekeyfile -out certfile [-days N] [-$hash] 
-days N
指定您希望证书有效的时间;对于虚拟证书,通常会选择一个较大的值,如3650,持续大约10年或更长时间,但如果需要,您也可以在将来轻松生成替换值。最安全的做法是不要超过2037年,因为有些C程序虽然比过去少了,但仍然受到影响。您可以指定自签名中使用的哈希;这并不重要,但有些人更喜欢避免使用默认值(SHA1),而是使用例如
-sha256
。如果希望使用
-sub
,可以在命令行上指定“subject”名称;请参阅手册页。X.509证书中还可以放置许多扩展名,但您是否需要其中任何一个扩展名,如果需要,哪些扩展名以及哪些扩展名和扩展名的值取决于将使用它的应用程序

一旦您在文件中拥有证书和私钥:

 openssl pkcs12 -export -in certfile -inkey privatekeyfile -out p12file 
在这两个命令上,您可以在命令行上指定密码,如您在发布的命令中所做的,如果您愿意的话;请参阅手册页和/或使用信息。请记住,这种做法使您的密码对其他进程(如果在共享系统上,通常包括其他用户)临时可见


为清楚起见:在CA颁发的证书上,签名哈希确实重要,不应为SHA1或更弱,但在根证书或自签名证书上,签名哈希通常不重要。

谢谢@dave_thompson_085,我尝试了您的解决方案,但没有成功。我想我困惑的是这些密钥需要在哪里生成,这有关系吗我在本地创建密钥-在本地创建.p12-发布节点应用程序-使用查询RESTAPI并使用发送签名。p12@huge-鬣蜥:密钥对在何处生成并不重要,因为(1)生成使用适当的熵/随机性(2)接收器/验证器?)使用与发送者/签名者的私钥匹配的公钥(始终!)(3)未经授权签名的任何人都不会获得私钥。(3)最简单的方法是在设备、系统或位置上生成密钥对,该密钥对将进行签名,并且不会复制到其他任何地方,但加密仍然适用于其他更复杂的密钥管理方案。@巨型鬣蜥:RSA的优点是签名的哈希可以恢复。捕获一对数据和签名,并使用
openssl rsautl-验证
(根据需要使用公钥、转换和任何hexdump)以查看密钥/签名或数据/哈希是否是问题所在,或者将它们添加到Q中(使用非敏感数据,并以保护形式(如base64)发布二进制文件),我们/我将这样做。