【发布时间】:2021-01-02 13:07:42
【问题描述】:
- 使用以下命令创建证书签名请求:
$ openssl genrsa -out test.key 2048
$ openssl req -new -key test.key -subj "/CN=foo" -out foo.csr
-
借助@marc 提供的步骤,我从中提取了 4 个文件:
- info.der (
openssl asn1parse -in foo.csr -strparse 4 -out info.der) - pub.pem (
openssl req -pubkey -in foo.csr -noout -out pub.pem) - hash.manual(保存的命令
"sha256 info.der"的十六进制输出) - sig.raw (
openssl asn1parse -in foo.csr -strparse 338 -out sig.raw)
- info.der (
-
我的理解/怀疑是,foo.csr 中提到的“签名”只不过是带有私钥“test.key”的“hash.manual”的“加密输出”。所以为了验证我的理解,我使用了
$ openssl rsautl -encrypt -in hash_manual -inkey test.key -out manual_signature
-
现在,当我对这两个文件执行 diff 时,它们不匹配,并且 hexdump -C 确认 sig.raw 与 (openssl req -in csr --text) 中提到的签名输出匹配。
-
请帮助澄清为什么 manual_signature 和 sig.raw 不匹配。
【问题讨论】:
-
verify的倒数是sign,而不是encrypt。 -
sign/signatue == rsa_encruption of (hash of (data)) ??这是我的理解。如果不是,请纠正我。
-
是的,但它使用私钥加密(请参阅rsautl man page)。普通加密使用公钥加密。因为其他算法不是这样工作的,所以我们通常说
sign和verify。因为test.key包含私钥和公钥,所以openssl只使用它需要的那个。
标签: encryption openssl public-key-encryption