我正在评估openssl用于生成PDF 签名。我发现PKCS7签名字段由openssl和其他程序。
我如何才能准确指定签名属性字段会包含在签名中吗?
例如,以下是通过融合:
$ meld <(openssl cms -inform DER -cmsout -print -in minimal_signed_pdfbox.pkcs7) \
<(openssl cms -inform DER -cmsout -print -in minimal_signed_adobe.pkcs7) \
<(openssl cms -inform DER -cmsout -print -in minimal.pkcs7)
左边:minimal_signed_pdfbox.pkcs7生成于pdfbox(它用充气城堡) 这边走:
java -jar pdfbox-sign.jar JohnSmith.pem <PASSWORD> minimal.pdf
- 将 PKCS7 提取到minimal_signed_pdfbox.pkcs7
中心:PKCS7生成于Adobe Reader DC(它用Adobe PubSec) 这边走:
创建一个数字身份证来自文件约翰史密斯.pfx
签署文件数字身份证
保存结果如下最小签名_adobe.pdf
将 PKCS7 提取到最小签名_adobe.pkcs7
正确的:PKCS7生成于OpenSSL通过此命令行:
openssl cms -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal.pkcs7
在前两种情况下PKCS7是从pdf使用窥视pdf工具。
这最小.pdf正在签名的文件是 ISO-32000 标准中描述的文件附件 H.2:最小 PDF 文件。
其余使用的文件和证书都压缩在这里:压缩包。
这签名和信息摘要字段不同,因为:
Adobe 在开始之前对文件进行线性化(也更改 PDF 版本)
已签名的 PKCS7 属性(签名属性)在每种情况下都不同(并且它们包含在计算中)
在现实情况下,PDF 需要额外的对象来包含签名,但为了简化,在本例中不存在这些签名。
签署PDF不仅仅是生成签名,还要将其嵌入到文件中。但现在我专注于签名格式(2)
一旦smime 功能被排除在外:
openssl cms -nosmimecap -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal_nosmimecap.pkcs7
差异更加明显:
其余差异如下:
Adobe不包括签约时间(1.2.840.113549.1.9.5)
pdfbox指定额外的签名属性1.2.840.113549.1.9.52未被认可(openssl asn1parse)以指定sha256 加密而不是指定签名算法/算法作为 sha256WithRSAEncryption (1.2.840.113549.1.1.11)
我该如何管理这些签名的属性?通过命令行我只有这个相关参数:
-noattr don't include any signed attributes
参数-nosmimecap未通过以下方式显示:
openssl cms --help
但有用,还有其他隐藏参数可以控制它吗?
我在用着:
$ openssl version
OpenSSL 1.0.2g 1 Mar 2016