在 PKCS7 签名中使用 OpenSSL 指定签名属性

在 PKCS7 签名中使用 OpenSSL 指定签名属性

我正在评估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 文件

其余使用的文件和证书都压缩在这里:压缩包

签名信息摘要字段不同,因为:

  1. Adobe 在开始之前对文件进行线性化(也更改 PDF 版本)

  2. 已签名的 PKCS7 属性(签名属性)在每种情况下都不同(并且它们包含在计算中)

  3. 在现实情况下,PDF 需要额外的对象来包含签名,但为了简化,在本例中不存在这些签名。

签署PDF不仅仅是生成签名,还要将其嵌入到文件中。但现在我专注于签名格式(2)

一旦smime 功能被排除在外:

openssl cms -nosmimecap -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal_nosmimecap.pkcs7

差异更加明显:

在此处输入图片描述

其余差异如下:

  1. Adobe不包括签约时间(1.2.840.113549.1.9.5)

  2. 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

相关内容