【问题标题】:Sign a file and verify with OpenSSL签署文件并使用 OpenSSL 进行验证
【发布时间】:2018-11-29 02:41:56
【问题描述】:

我在理解 openSSL 的签名和验证过程方面有些困难。

我有一个小的证书层次结构:根证书 => 子证书 => 最终实体证书。 我想从最终实体 CA 获得一个代码签名证书,因此创建了一个密钥对并请求了一个 CSR:

openssl genrsa -out key.pem
...
openssl genrsa -pubout -in key.pem -out key.pub.pem
...
openssl req -new -sha256 -key key.pem -out id.csr
...

我发送我的 CSR 并接收存储在 cert.pem 中的代码签名证书。 我的理解是这个证书只用于验证目的(验证签名),我的代码应该用私钥(key.pem)签名:

openssl dgst -sha256 -sign key.pem -out program.sign program

因此,我有使用 key.pem 签名的 program.sign。然后,我需要验证这个签名,考虑到我有 4 个用于路径验证的证书:root.pem、sub.pem、end.pem、cert.pem。

如何让openssl用链中的多个证书验证签名来校验?

我试过这个,但它当然不起作用,因为我只指定代码签名证书,没有链的其余部分:

openssl dgst -sha256 -verify program -signature program.sign cert.pem
undable to load key file

我错过了什么吗?

非常感谢。

【问题讨论】:

    标签: openssl rsa digital-signature x509 pki


    【解决方案1】:

    大部分都是骗verifying a file signature with openssl dgst

    你的描述有点混乱;我解释说“最终实体 CA”是指颁发 EE 证书的 CA,因为 EE 不是 CA,CA 也不是 EE,而您所说的“最终实体证书”实际上并不是最终实体的证书。具体来说,我解释说您的cert.pem 是由CA 颁发的证书,其证书在end.pem 中,使用相应的私钥,因此root.pem sub.pem end.pem cert.pem 实际上形成了一条认证路径,即链。

    openssl dgst -verify 甚至不拿证书,更不用说验证了。它只需要 publickey,并使用它来验证数据上的签名——或者可选地获取私钥并派生公钥并使用它,但通常验证签名的一方不会也不应该有私钥。如果你想使用命令行来验证一个证书链的签名,你需要做两件事,按任意顺序:

    • 使用openssl verify 验证证书链;您可以使用-untrusted 提供中间证书(作为单个文件,在您的情况下为cat sub.pem end.pem),或者使用信任库中的中间证书(以及根),这可以是您创建的证书并指定,或者原则上可以是默认值(但这通常是系统范围的并且更改它是不明智的)。见Verify a certificate chain using openssl verifyOpenssl verify with chained CA and chained Cert(披露:我的)。

    • 使用openssl x509 -pubkey -in cert.pem -out pubkeyfile从叶子证书中获取公钥,并使用它来验证数据的签名,您必须在选项之后指定数据文件,否则为标准输入,见下文。

    (如果没有这个虚拟文本,我无法正确获取这些格式)

    openssl dgst -sha256 -verify pubkeyfile -signature program.sign program
    openssl dgst -sha256 -verify pubkeyfile -signature program.sign <program
    

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2011-01-24
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多