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 以来 pkeyutlif 你指定摘要算法:

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 更简单。