使用.p12文件发送签名并使用Node Crypto验证进行验证

时间:2018-04-13 18:53:28

标签: 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

在节点后端我正在验证这样的调用:

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文件生成签名并发送到其余API。鉴于以上情况,我将如何使用openssl生成一个发送有效签名的.p12文件?

1 个答案:

答案 0 :(得分:0)

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

 openssl req -new -x509 -key privatekeyfile -out certfile [-days N] [-$hash] 

-days N指定您希望证书有效的时间;对于虚拟证书,通常选择像3650这样的大值大约10年或更长时间,尽管如果需要,您可以在将来轻松生成替换。最安全的是不要超过2037年,因为一些C程序虽然比过去少,但仍受Y2038 bug的影响。您可以指定自签名中使用的哈希值;这并不重要,但有些人更喜欢避免默认(SHA1)并使用例如而是-sha256。如果您希望使用-subj,可以在命令行上指定“主题”名称;请参见手册页。还有许多可以放在X.509证书中的扩展,但是你是否想要它们中的任何一个,如果是,那么哪些和哪些值会根据将使用它的应用程序而有所不同

在文件中有cert和privatekey后:

 openssl pkcs12 -export -in certfile -inkey privatekeyfile -out p12file 

在这两个命令中,您可以在命令行上指定密码,就像您在发布的命令中所做的那样,如果您愿意的话;查看手册页和/或使用消息。请记住,这种做法会使您的密码暂时对其他进程可见,通常包括其他用户(如果在共享系统上)。

为清楚起见:在CA颁发的证书上,签名哈希很重要,不应该是SHA1或更弱,但在root或自签名证书上通常无关紧要。