【问题标题】:Digital signature for a file using openssl使用 openssl 对文件进行数字签名
【发布时间】:2012-06-02 17:07:00
【问题描述】:

有没有办法使用 openssl 对 x509 证书或任何文档进行数字签名?

【问题讨论】:

    标签: cryptography openssl rsa


    【解决方案1】:

    生成私钥

    openssl genrsa -out privatekey.pem 2048
    

    签名

    openssl dgst -sha256 -sign privatekey.pem -out data.txt.signature data.txt
    

    生成公钥

    dgst -verify 需要公钥

    openssl rsa -in privatekey.pem -outform PEM -pubout -out publickey.pem
    

    验证

    openssl dgst -sha256 -verify publickey.pem -signature data.txt.signature data.txt
    
    • 如果成功:打印"Verified OK",返回码0
    • 如果失败:打印"Verification Failure",返回码1

    【讨论】:

    • 这有帮助 - 我有 crt 文件,但不知道如何在没有 .pub 文件的情况下进行验证。现在我知道了;-)
    • 澄清一下,some-file.sha256实际上是签名(例如signature.txt),some-file实际上是要签名的消息(例如message.txt)。所以在这两个操作中,some-file 是一个输入文件。在-sign操作中,signature.txt是一个输出文件,在-verify操作中,signature.txt是一个输入文件。我会编辑它,但如果你愿意,我会让你这样做。
    • @reto some-file.sha256是二进制文件吗?这是正常的吗?因为这样做之后我得到了一个看起来像这样的文件内容@ugڻ��^{�{�9T�*�xAO"kd{�����d������͊��(����k�,A'c;�&�g��[b��e�i:��hh0���^���:�Y@��e�$��A������-�?�'� 执行给定命令后:openssl dgst -sha256 -sign snakeoil.key -out some-file.sha256 some-file
    • @Roel 正常,意料之中。
    【解决方案2】:

    是的,OpenSSL 的 dgstrsautl 组件可用于计算给定 RSA 密钥对的签名。

    签名:

    openssl dgst -sha256 data.txt > hash
    openssl rsautl -sign -inkey privatekey.pem -keyform PEM -in hash >signature
    

    仅验证签名:

    openssl rsautl -verify -inkey publickey.pem -pubin -keyform PEM -in signature
    

    更新:从下方捕获 Reto 的 cmets,因为这是一个重要的细微差别。大概如果您要麻烦进行验证,您想知道签名是在它所附加的明文上生成的:

    这对某些人来说可能听起来很明显,但是:请注意,rsautl verify 只是解密文件signature。此调用的输出保证由私钥的所有者生成,但除此之外没有任何其他检查。因此,要实际验证data.txt 的一致性,您必须重新生成摘要,然后将其与openssl rsautl -verify 的输出进行比较。

    验证私钥的所有者确实为data.txt提供担保:

    openssl dgst -sha256 -verify publickey.pem -signature signature data.txt
    

    对于此操作,openssl 需要公钥、签名和消息。

    【讨论】:

    • 这将在文件“hash”中留下一个 hex/ascii 形式的哈希,如果你想要一个二进制版本的哈希被签名,你需要在 openssl 上使用“-binary” dgst 命令行。
    • 我的openssl 版本还需要-pubin 才能进行验证。
    • 这对某些人来说可能听起来很明显,但是:请注意,rsault verify 只是解密文件signature。此调用的输出保证由私钥的所有者生成,但除此之外没有任何其他检查。因此,要实际验证data.txt 的一致性,您必须重新生成摘要,然后将其与openssl rsautl -verify 的输出进行比较。
    • 不幸的是,Stack Overflow 的人工制品使这种情况不太可能发生。由于此答案是公认的答案,因此它将继续比您的答案更明显。我至少投了你的票。
    • 嗨,我只是用同样的方法测试。我使用“openssl rsautl -verify -inkey publickey.pem -pubin -keyform PEM -in signature”来获取哈希值,和我的哈希文件一样。但是我使用“openssl dgst -sha256 -verify publickey.pem -signature signature data.txt”,它显示验证失败。为什么会这样?
    【解决方案3】:

    要在 openssl 中数字签名文档,它将起作用

    首先,您的证书应该是可信的 应该是这样的

    -----BEGIN TRUSTED CERTIFICATE-----
    MIIDbjCCAlYCCQCOyunl25ProDANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJJ
    ...
    -----END TRUSTED CERTIFICATE-----
    

    然后使用以下命令

    smime -sign -signer certificate.pem -inkey private.key -in test.txt \
        -out test1.txt -from ashish -to singhal
    

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2014-03-22
      • 2015-09-12
      • 2015-02-26
      相关资源
      最近更新 更多