我正在尝试验证来自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文件生成一个签名并发送到rest。鉴于以上所述,我将如何使用openssl生成一个发送有效签名的.p12文件?
发布于 2018-04-13 20:13:19
要创建一个PKCS12文件,您需要私钥(已经拥有)和an (X.509)证书,其中包含匹配的公钥,或者如果适用的话,需要一系列证书,从匹配的证书开始,称为‘链’。您可以从CA获得此证书/链,或者OpenSSL可以创建一个自签名证书,该证书不使用链,许多应用程序都可以接受,但不是全部:
openssl req -new -x509 -key privatekeyfile -out certfile [-days N] [-$hash] -days N指定您希望证书有效的时间;对于虚拟证书,通常在大约10年或更长的时间内选择3650这样的大值,不过如果需要的话,将来也可以很容易地生成替换值。不超过2037年是最安全的,因为一些C程序虽然比过去少,但仍然受到Y2038错误的影响。您可以指定在自签名中使用的散列;这并不重要,但有些人倾向于避免默认(SHA1),而使用例如-sha256。如果您希望使用-subj,可以在命令行上指定“subject”名称;请参见手册页。还有许多扩展可以放在X.509证书中,但是您是否需要它们中的任何一个,如果需要,哪些扩展和值会根据使用它的应用程序的不同而变化。
一旦您在文件中获得了证书和私钥:
openssl pkcs12 -export -in certfile -inkey privatekeyfile -out p12file 在这两个命令上,您都可以在命令行上指定密码,就像您在发布的命令中所做的那样,如果您愿意,可以查看手册页和/或使用消息。请记住,这种做法使您的密码对其他进程暂时可见,如果在共享系统上,则通常包括其他用户。
为了清楚起见:在CA颁发的证书上,签名散列确实很重要,不应该是SHA1或更弱,但是在根证书或自签名证书上,它通常并不重要。
https://stackoverflow.com/questions/49823498
复制相似问题