【问题标题】:Generating, Signing and Verifying Digital Signature生成、签名和验证数字签名
【发布时间】:2016-11-12 17:03:30
【问题描述】:

这是我项目中的一个问题。

在这个任务中,我们将使用 OpenSSL 来生成数字签名。请准备一个任意大小的文件(example.txt)。还要准备一个 RSA 公钥/私钥对。然后执行以下操作:

  1. 对example.txt的SHA256哈希签名;将输出保存在 example.sha256 中。
  2. 验证 example.sha256 中的数字签名。
  3. 稍微修改example.txt,再次验证数字签名。

请描述您是如何执行上述三个操作的(例如,您使用的确切命令等)。描述你观察到的并解释你的观察。还请解释为什么数字签名通常很有用。

所以,我执行以下操作。

1.创建私钥/公钥对

openssl genrsa -out private.pem 1024

2。提取公钥。

openssl rsa -in private.pem -out public.pem -outform PEM -pubout

3.创建数据的哈希。

echo 'data to sign' > example.txt

openssl dgst -sha256 < example.txt > hash

4.使用私钥将哈希签名到名为 example.sha256 的文件

openssl rsautl -sign -inkey private.pem -keyform PEM -in hash  > example.sha256

5.验证文件(example.txt)和数字签名(example.sha256)

openssl dgst -sha256 -verify public.pem -signature example.sha256 example.txt

完成所有这些操作后,我收到一条错误消息“验证失败

如果我在某个地方出错了,请纠正我。

【问题讨论】:

    标签: openssl signature


    【解决方案1】:

    不要为此使用rsautl

    根据 PKCS1.5,当签署进入 RSA 操作的数据格式时,看起来像这样:

    <padding><metadata><hash of input>
    

    (元数据指定使用了哪个哈希函数。)

    当您尝试验证签名时,openssl dgst -verify 正在寻找这种格式。但是,这不是您在步骤中创建的。

    首先openssl dgst 的默认输出是结果哈希的十六进制编码,而不是原始字节。

    其次,rsautl 相当“低级”,并且在签名时不会添加 openssl dgst -verify 所期望的元数据,尽管它确实添加了填充。

    这两件事加在一起意味着您正在使用的数据如下所示:

    <padding><hex digits of hash of input>
    

    显然这与openssl dgst -verify 的预期不符,因此验证失败。

    可以为rsautl 创建一个格式正确的输入,但这会很尴尬并且涉及处理ASN.1 细节。您也可以使用 rsautl -verify 而不是 dgst -verify,但这还需要更多详细信息,这意味着您使用的是非标准签名格式。

    最简单的解决方案是使用openssl dgst 来创建和验证签名。将步骤 3 和 4(创建 example.txt 文件除外)替换为单个命令:

    $ openssl dgst -sha256 -sign private.pem -out example.sha256 example.txt
    

    这会对数据进行散列,正确格式化散列并对其执行 RSA 操作。生成的文件应使用openssl dgst -verify 命令正确验证。

    【讨论】:

    • 嘿@matt 随机问题。我为 PKILabServer.com 签署了一个证书(在 Common Name 下列出),打开 /etc/hosts 并将一个条目添加到 127.0.0.1 PKILabServer.com 然后使用命令 % openssl s_server –cert server.pem -www 我点启动服务器浏览器到PKILabServer.com:4433 然后它显示“无效的安全证书...”然后我加载我的证书文件并且网站加载完美。问题是由于 PKILabServer.com 指向 localhost,如果我们使用 localhost:4433 代替,我们将连接到同一个 Web 服务器。
    • 但是当我将浏览器指向 localhost:4433 时,我收到一条错误消息“此证书仅对 pkilabserver.com 有效...”我需要在我的项目。这就是我的回答。如果我错了,请纠正我。
    • 这是因为生成的证书签名请求是专门为 PKILabServer.com 签名的(因为它在 Common Name 下列出)因为 /etc/hosts 文件有很多条目在 localhost 下列出的其他网站,因此将浏览器指向 https:localhost.com:4433 将获取 /etc/hosts 文件中列出的网站,并且由于网站不匹配,我们收到错误“证书仅对 PKILabServer.com 有效”
    【解决方案2】:

    感谢马特的解决方案。小尼特: OP 似乎想要签署哈希而不是实际的整个数据(也是我想做的事情)。所以使用下面来生成签名:

    openssl dgst -sha256 -sign private.pem -out hash.sig hash
    

    下面来验证签名

    openssl dgst -sha256 -verify public.pem -signature hash.sig hash
    

    最后像下面这样来验证有效载荷的完整性:

    echo "`hash` example.txt" | sha256sum -c --strict
    

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 2012-07-23
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2020-10-01
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多