我正在尝试从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文件?
答案 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或自签名证书上通常无关紧要。