不要用 rsautl 为了这。
rsautl
根据PKCS1.5,当签署进入RSA操作的数据格式时,看起来像这样:
<padding><metadata><hash of input>
(元数据指定使用了哪个哈希函数。)
这种格式是什么 openssl dgst -verify 在您尝试验证签名时正在寻找。但是,这不是您在步骤中创建的内容。
openssl dgst -verify
首先是默认输出 openssl dgst 是个 十六进制编码 产生的哈希值,而不是原始字节。
openssl dgst
其次, rsautl 是一个相当低的水平and,并且在签名时不添加元数据 openssl dgst -verify 期待,虽然它确实增加了填充。
这两件事一起意味着您使用的数据如下所示:
<padding><hex digits of hash of input>
显然这与什么不符 openssl dgst -verify 期待,所以验证失败。
可以为其创建格式正确的输入 rsautl ,但它很尴尬,涉及处理ASN.1的细节。你也可以用 rsautl -verify 代替 dgst -verify ,但这也需要更多的细节,这意味着你使用的是非标准的签名格式。
rsautl -verify
dgst -verify
最简单的解决方案是使用 openssl dgst 用于创建和验证签名。替换您的步骤3和4(除了创建 example.txt file)使用单个命令:
example.txt
$ openssl dgst -sha256 -sign private.pem -out example.sha256 example.txt
这会散列数据,正确格式化散列并执行RSA操作。生成的文件应正确验证 openssl dgst -verify 命令。