openssl命令行验证签名

Posted

技术标签:

【中文标题】openssl命令行验证签名【英文标题】:openssl command line to verify the signature 【发布时间】:2011-07-05 15:42:55 【问题描述】:

您好,我已生成密钥对并使用私钥生成签名。

openssl rsautl -sign -in helloworld.txt -inkey aa.pem -out sig

但是我无法使用我的公钥验证签名:

openssl rsautl -verify -in helloworld.txt -inkey aa.pub -sigfile sig

我知道 -sigfile 已被弃用。来自 openssl.org 的一些在线文档是错误的。

我应该使用什么命令来使用我的公钥验证签名?

【问题讨论】:

你的方法是正确的,我缺少摘要部分,试图签署整个文件!谢谢你的帮助!我还发现了一些有用的链接,我用它来做 X.509 CA 的事情:sandbox.rulemaker.net/ngps/m2/howto.ca.htmloctaldream.com/~scottm/talks/ssl/opensslca.html 【参考方案1】:

我为您的问题找到了两种解决方案。

您可以这样使用 rsautl:(使用私钥:my.key 和公钥 my-pub.pem)

$ openssl rsautl -sign -inkey my.key -out in.txt.rsa -in in.txt
Enter pass phrase for my.key:
$ openssl rsautl -verify -inkey my-pub.pem -in in.txt.rsa -pubin
Bonjour

使用此方法,所有文档都包含在签名文件中,并由最终命令输出。

但就我而言,我的证书显示:签名算法:sha1WithRSAEncryption。 因此,我建议您分 4 步使用标准的文档签名方式:(此方法用于所有非对称电子签名,以免对签名文件和/或 CPU 使用率过高)

    创建要签名的文档摘要(发件人) 用私钥签署摘要(发件人) 创建文档摘要以验证(收件人) 使用公钥验证签名(收件人)

OpenSSL 分两步完成:

$ openssl dgst -sha256 -sign my.key -out in.txt.sha256 in.txt 
Enter pass phrase for my.key:
$ openssl dgst -sha256 -verify my-pub.pem -signature in.txt.sha256 in.txt  
Verified OK

使用此方法,您向收件人发送了两个文档:原始文件纯文本,签名文件签名摘要。注意:签名文件不包括整个文件!只有摘要。

【讨论】:

当使用这个命令行来验证给定数据的签名时,我得到以下错误输出:Verification failure\n Error in dgst 这意味着验证失败是因为错误还是因为文件没有匹配正确吗? 签名解码失败并没有真正的原因,所以我会说不匹配。 你知道签名的格式是否重要吗?我认为.sign的格式没有处理 你真的应该看看文档。签名文件是文本文件,扩展名无关紧要。是的,文件内容有一个格式,但不看它,我不能说它是否可以。首先使用我放在这里的命令和一个随机文本文件对其进行测试,它应该可以工作,然后测试您自己的文件。【参考方案2】:

使用公钥验证

echo "plop" > "helloworld.txt"
openssl rsautl -sign -in hello.txt -inkey private.pem -out sig
openssl rsautl -verify -in sig -inkey public.pem -pubin
> plop

【讨论】:

【参考方案3】:

你的方法基本正确。您错过的是通过添加“-pubin”告诉 rsautl inut 密钥文件文件是公钥。 项目“-pubin”OpenSSL rsautl 文档不准确 " -pubin 输入文件是一个 RSA 公钥。 " 应该 " -pubin 输入密钥文件是 RSA 公钥。 " 由于输入文件应该是签名文件。

【讨论】:

【参考方案4】:

您可以查看rsautl 的文档

在您的示例中,这将给出:

openssl rsautl -verify -in sig -inkey aa.pem

我在下面复制了我的完整历史记录:

echo "plop" > "helloworld.txt"
openssl rsautl -sign -in helloworld.txt -inkey aa.pem -out sig
openssl rsautl -verify -in sig -inkey aa.pem
> plop

【讨论】:

您好,谢谢,我确实阅读了手册,但我需要使用公钥来验证。不是私钥。 使用 -pubin 并将公钥作为参数传递给 -inkey

以上是关于openssl命令行验证签名的主要内容,如果未能解决你的问题,请参考以下文章

Openssl 命令行无法验证之前创建的分离的 smime 签名

Openssl命令行用法简介

openssl dgst(生成和验证数字签名)

使用Openssl生成自签名证书

sh 笔记:OpenSSL生成「自签名」证书,配置Nodejs本地HTTPS服务 - 3.生成.csr文件命令行中的提示内容

我们如何在 C++ 和 windows API 中验证 openssl 数字签名