如何计算 SignerInfo 中的消息摘要?
How to compute message-digest in a SignerInfo?
我正在尝试生成启用 LTV 的 pdf。我生成了一个 pkcs7 对象,其中包含 signerInfo 对象所需的所有属性。生成的签名有效但未启用 LTV。根据 PDF 参考手册,我需要包含验证信息(CRLS 或 OCSP ...),并且基于 rfc3852,此内容位于 signedAttributes 对象中,并且它必须包含一个内容类型属性和一个消息摘要属性。我的问题是如何计算消息摘要值,是否需要在 pdf 内容旁边签名?
注意:包含 CRL 的 adbe-revocationInfoArchival 对象似乎是正确的,因为 acrobat 直接从文件中读取吊销信息。我似乎遇到的唯一问题是 signedAttrs 对象 and/or 中包含的消息摘要未正确计算签名值。 RFC 并不清楚消息摘要应该是什么,或者它是否应该包含在将使用签名者私钥签名的摘要中。
在对问题的评论中来回反复之后,我仍然不确定你需要什么信息,所以这里有一些关于非平凡 CMS 签名的结构和内容的一般想法PDF 签名的容器。
规格
不过,首先要谈谈使用规范。您提到了 PDF 参考手册 和 rfc3852。两者实际上都不再是最先进的,但有趣的是一个比另一个少。
最初,PDF 1.7 之前的 Adobe PDF 参考文档是要查看的文档。不幸的是,Adobe 将这些参考文献视为 本质上不规范 ,即如果当前参考文献和当前 Acrobat 版本在某些方面存在分歧,则该程序是正确的,而不是参考文献!
最新的 Adobe PDF 参考(PDF 1.7)参考了 RFC 2315 的签名容器结构。
随后Adobe将PDF格式的权威权移交给了国际标准化组织(ISO),后者在2008年发布了第一个规范的PDF规范ISO 32000-1,与上一个非常相似PDF 内容参考,但采用 RFC'ish 语言。
ISO 32000-1 对签名容器的结构同时参考了 RFC 3852 和 RFC 2315。这很奇怪,但很可能剩余的 RFC 2315 参考是一个疏忽。
2017 年,ISO 发布了 PDF 2.0 的 PDF 规范,ISO 32000-2,其中包含一些相关更改,也在签名方面。
ISO 32000-2 参考 RFC 5652 用于 adbe.pkcs7.detached 签名的签名容器结构,并参考 ETSI EN 319 122 用于结构ETSI.CAdES.detached 个签名的签名容器。
2020 年,ISO 更新了 ISO 32000-2,并进行了多项澄清;签名容器规范的引用保持不变。
因此,目前您应该查看 ISO 32000-2:2020 和 RFC 5652。
CMS 签名容器
在迟到的评论中你说
I want to know how do i add these attributes to the final digest to sign. I'm using SHA to digest the pdf, then sign it with the rsa private key and build the pkcs7 structure including the certificate chain, the signed message and a timestamp as an unsigned attribute.
此过程只能创建简单的签名容器 没有 签名属性,因为只有在这些简单的容器中,文档哈希才会直接签名。但是你要添加的adbe-revocationInfoArchival属性必须是signed属性,一旦涉及到signed属性,document hash值就不再直接签名了
CMS 签名容器包含一个 SignedData
对象,其中恰好有一个 SignerInfo
对象。 SignerInfo
对象定义为
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
(RFC 5652 第 5.3 节。“SignerInfo 类型”)
在由您的工作代码创建的签名容器中,可选 signedAttrs
不存在,signature
值立即计算为文档哈希。
不过,只要有签名的属性,可选的 signedAttrs
就不再缺失,而是 SET
个 Attribute
实例,至少包括
- 一个 content-type 属性以 id-data 作为值,
- a message-digest 属性以待签名 PDF 字节范围的摘要值作为值,
- 在你的例子中,一个 adbe-revocationInfoArchival 属性以撤销信息作为值。
在这种情况下,signature
值不再 立即计算文档哈希,但而不是 signedAttrs
!
的哈希值
更准确的说,是针对其完全DER编码的hash值计算的,而不是IMPLICIT[0]标签 但带有 EXPLICIT SET OF 标签。
因此,在使用 SHA 消化 pdf 之后,您无需 使用 rsa 私钥对其进行签名并构建 pkcs7 结构 继续通过
- 至少使用上面列举的属性条目构建签名属性集,对设置的 DER 编码并对其进行哈希处理,
- 使用您的私钥对已签名属性的哈希值进行签名,并且
- 使用这些已签名的属性和此签名值以及证书链构建 CMS 签名容器结构。
此外,您可以添加签名时间戳。
我正在尝试生成启用 LTV 的 pdf。我生成了一个 pkcs7 对象,其中包含 signerInfo 对象所需的所有属性。生成的签名有效但未启用 LTV。根据 PDF 参考手册,我需要包含验证信息(CRLS 或 OCSP ...),并且基于 rfc3852,此内容位于 signedAttributes 对象中,并且它必须包含一个内容类型属性和一个消息摘要属性。我的问题是如何计算消息摘要值,是否需要在 pdf 内容旁边签名?
注意:包含 CRL 的 adbe-revocationInfoArchival 对象似乎是正确的,因为 acrobat 直接从文件中读取吊销信息。我似乎遇到的唯一问题是 signedAttrs 对象 and/or 中包含的消息摘要未正确计算签名值。 RFC 并不清楚消息摘要应该是什么,或者它是否应该包含在将使用签名者私钥签名的摘要中。
在对问题的评论中来回反复之后,我仍然不确定你需要什么信息,所以这里有一些关于非平凡 CMS 签名的结构和内容的一般想法PDF 签名的容器。
规格
不过,首先要谈谈使用规范。您提到了 PDF 参考手册 和 rfc3852。两者实际上都不再是最先进的,但有趣的是一个比另一个少。
最初,PDF 1.7 之前的 Adobe PDF 参考文档是要查看的文档。不幸的是,Adobe 将这些参考文献视为 本质上不规范 ,即如果当前参考文献和当前 Acrobat 版本在某些方面存在分歧,则该程序是正确的,而不是参考文献!
最新的 Adobe PDF 参考(PDF 1.7)参考了 RFC 2315 的签名容器结构。
随后Adobe将PDF格式的权威权移交给了国际标准化组织(ISO),后者在2008年发布了第一个规范的PDF规范ISO 32000-1,与上一个非常相似PDF 内容参考,但采用 RFC'ish 语言。
ISO 32000-1 对签名容器的结构同时参考了 RFC 3852 和 RFC 2315。这很奇怪,但很可能剩余的 RFC 2315 参考是一个疏忽。
2017 年,ISO 发布了 PDF 2.0 的 PDF 规范,ISO 32000-2,其中包含一些相关更改,也在签名方面。
ISO 32000-2 参考 RFC 5652 用于 adbe.pkcs7.detached 签名的签名容器结构,并参考 ETSI EN 319 122 用于结构ETSI.CAdES.detached 个签名的签名容器。
2020 年,ISO 更新了 ISO 32000-2,并进行了多项澄清;签名容器规范的引用保持不变。
因此,目前您应该查看 ISO 32000-2:2020 和 RFC 5652。
CMS 签名容器
在迟到的评论中你说
I want to know how do i add these attributes to the final digest to sign. I'm using SHA to digest the pdf, then sign it with the rsa private key and build the pkcs7 structure including the certificate chain, the signed message and a timestamp as an unsigned attribute.
此过程只能创建简单的签名容器 没有 签名属性,因为只有在这些简单的容器中,文档哈希才会直接签名。但是你要添加的adbe-revocationInfoArchival属性必须是signed属性,一旦涉及到signed属性,document hash值就不再直接签名了
CMS 签名容器包含一个 SignedData
对象,其中恰好有一个 SignerInfo
对象。 SignerInfo
对象定义为
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
(RFC 5652 第 5.3 节。“SignerInfo 类型”)
在由您的工作代码创建的签名容器中,可选 signedAttrs
不存在,signature
值立即计算为文档哈希。
不过,只要有签名的属性,可选的 signedAttrs
就不再缺失,而是 SET
个 Attribute
实例,至少包括
- 一个 content-type 属性以 id-data 作为值,
- a message-digest 属性以待签名 PDF 字节范围的摘要值作为值,
- 在你的例子中,一个 adbe-revocationInfoArchival 属性以撤销信息作为值。
在这种情况下,signature
值不再 立即计算文档哈希,但而不是 signedAttrs
!
更准确的说,是针对其完全DER编码的hash值计算的,而不是IMPLICIT[0]标签 但带有 EXPLICIT SET OF 标签。
因此,在使用 SHA 消化 pdf 之后,您无需 使用 rsa 私钥对其进行签名并构建 pkcs7 结构 继续通过
- 至少使用上面列举的属性条目构建签名属性集,对设置的 DER 编码并对其进行哈希处理,
- 使用您的私钥对已签名属性的哈希值进行签名,并且
- 使用这些已签名的属性和此签名值以及证书链构建 CMS 签名容器结构。
此外,您可以添加签名时间戳。