OpenSSL 仅对摘要进行数字签名
OpenSSL Digitally Sign Digest Only
我有一个签名服务器,您可以在其中上传文件,它会用数字签名进行响应。
它正在使用 openssl dgst -sha256 -sign
,效果很好。
但是,我们不得不开始对大文件 (>1 GB) 进行签名,而且上传过程需要很长时间。我的想法是我们可以在本地计算 sha256 摘要并将其传递给签名服务器,这将大大加快速度。然而,这个看似简单的任务对于 openssl 来说似乎非常困难。这有什么原因吗?
我找到了一种可能的解决方案 here,但与当前的 dgst
单行程序相比,它非常复杂,并且涉及生成 ASN1 配置文件。
这真的是在不需要文件的情况下使用 openssl 生成数字签名的唯一方法吗?
编辑:使用@dave_thompson_085的回答,我创建了以下脚本:
#!/bin/bash
# Usage: [=10=] <sha256 digest>
# Example usage: ./sign_256sha.sh 5d525e3513b493798a7ac353401ef040ea6de92809485292201b8f27731e6379
# Input to openssl pkeyutl is binary, not ASCII hex,... need to convert using xxd
echo | xxd -r -p | openssl pkeyutl -sign -inkey privkey.pem -pkeyopt digest:sha256
相当于:
openssl dgst -sha256 -sign privkey.pem <file>
只要把<file>
的sha256摘要传给第一个即可。
你显然想要一个 RSA 签名,特别是 OpenSSL 的默认 RSASSA-PKCS1v1_5,尽管你的问题没有这么说,而且 OpenSSL 支持其他几种签名算法。你忽略了评论链接#9951559
至 Different signatures when using C routines and openssl dgst, rsautl commands as well as dupe 以及更多链接。
rsautl
不会在 rfc8017 et pred 9.2 的第 2 步进行 ASN.1 DigestInfo 编码,但自 2010 年 1.0.0 以来 pkeyutl
会 if 你指定摘要算法:
openssl pkeyutl -sign -inkey privkey.pem -pkeyopt digest:sha256
# note input is binary; if you transport to the server as hex, use
# xxd -r -p or the printf $(echo $x | sed 's/../\x&/g') hack or similar
# output is also binary by default, like rsautl which you seem to handle
或者 PKCS1 (rfc8017 et pred) 的同一部分对于所有标准的 hash-with-RSA 方案都有不变的前缀值,这仍然比计算 DER 更简单。
我有一个签名服务器,您可以在其中上传文件,它会用数字签名进行响应。
它正在使用 openssl dgst -sha256 -sign
,效果很好。
但是,我们不得不开始对大文件 (>1 GB) 进行签名,而且上传过程需要很长时间。我的想法是我们可以在本地计算 sha256 摘要并将其传递给签名服务器,这将大大加快速度。然而,这个看似简单的任务对于 openssl 来说似乎非常困难。这有什么原因吗?
我找到了一种可能的解决方案 here,但与当前的 dgst
单行程序相比,它非常复杂,并且涉及生成 ASN1 配置文件。
这真的是在不需要文件的情况下使用 openssl 生成数字签名的唯一方法吗?
编辑:使用@dave_thompson_085的回答,我创建了以下脚本:
#!/bin/bash
# Usage: [=10=] <sha256 digest>
# Example usage: ./sign_256sha.sh 5d525e3513b493798a7ac353401ef040ea6de92809485292201b8f27731e6379
# Input to openssl pkeyutl is binary, not ASCII hex,... need to convert using xxd
echo | xxd -r -p | openssl pkeyutl -sign -inkey privkey.pem -pkeyopt digest:sha256
相当于:
openssl dgst -sha256 -sign privkey.pem <file>
只要把<file>
的sha256摘要传给第一个即可。
你显然想要一个 RSA 签名,特别是 OpenSSL 的默认 RSASSA-PKCS1v1_5,尽管你的问题没有这么说,而且 OpenSSL 支持其他几种签名算法。你忽略了评论链接#9951559
至 Different signatures when using C routines and openssl dgst, rsautl commands as well as dupe
rsautl
不会在 rfc8017 et pred 9.2 的第 2 步进行 ASN.1 DigestInfo 编码,但自 2010 年 1.0.0 以来 pkeyutl
会 if 你指定摘要算法:
openssl pkeyutl -sign -inkey privkey.pem -pkeyopt digest:sha256
# note input is binary; if you transport to the server as hex, use
# xxd -r -p or the printf $(echo $x | sed 's/../\x&/g') hack or similar
# output is also binary by default, like rsautl which you seem to handle
或者 PKCS1 (rfc8017 et pred) 的同一部分对于所有标准的 hash-with-RSA 方案都有不变的前缀值,这仍然比计算 DER 更简单。