是否可以仅在应用 pdf 签名时而不是在使用 iText 7 创建哈希时设置 CRL

Is it possible to set the CRL only when applying the pdf signature and not when creating the hash using iText 7

我正在使用以下代码创建最终由专用 HSM 签名的 pdf 文档的哈希值。 CRL 和 OCSP 参数在这里设置为空,因为它们尚不清楚。此代码在我自己的 IExternalSignatureContainer.Sign 实现中执行。

//Create the hash of the pdf for signing
                byte[] sh = pkcs7Signature.GetAuthenticatedAttributeBytes(hash, null, null, PdfSigner.CryptoStandard.CMS);
                using (SHA256 sha256 = SHA256.Create())
                {
                    sh = sha256.ComputeHash(sh);
                }
                // >> Call HSM for creating the signature

HSM 然后 returns 签名、CRL 和 OCSP(这意味着我之前无法访问 CRL)。创建签名后,我会生成 PKCS7 容器,该容器除了签名外还包含 CRL。

          pkcs7Signature.SetExternalDigest(signature, null, "RSA");
            return pkcs7Signature.GetEncodedPKCS7(hash, null, null, crl, PdfSigner.CryptoStandard.CMS);

在这种情况下,pdf 中生成的签名无效。 我做了一些测试,当我将 CRL 添加到 GetAuthenticatedAttributeBytes 时,一切正常。

我的问题是我当时没有 CRL。

问题: 是否可以在没有 CRL 的情况下创建散列,然后将 CRL 应用于创建的 PKCS7 容器并保持签名在 pdf 中有效?

Question: Is it possible to create the hash without a CRL and then apply the CRL on the created PKCS7 container and keeping the signature valid in the pdf?

没有。至少不是以有用的方式。不过,根据所遵循的确切签名配置文件,您之后可以 附加 增量更新中的 CRL 到已签名的 PDF。

详细:

没有

在普通的 ISO 32000-1 中,可互操作的签名撤销信息(CRL 和 OCSP 响应)被添加到特定的、Adobe 定义的、签名的属性(又名 经过身份验证的属性),请参阅 ISO 32000-1 第 12.8.3.3.2 节撤销信息。

签名属性 是签名内容的一部分,因此通过在没有它的情况下计算哈希但稍后将其包含在完成的签名容器中,您会得到一个无效签名。

至少不是有用的方式。

当然可以考虑将 CRL 添加到 CMS 签名容器中,CMS 规范要求 CRL。这是容器的未签名部分,因此可以在不影响签名有效性的情况下添加 CRL。

但是根据 PDF 规范,嵌入在 PDF 中的 CMS 容器中的撤销信息预计在其他地方,签名验证器不应使用此类 CRL,尤其是 Adob​​e Reader 不会。

选项取决于配置文件。

上面的讨论重点是根据普通 ISO 32000-1 在 PDF 中嵌入撤销信息。

如果您可以根据 ISO 32000-1 加 ESIC 扩展级别 2 或 ADBE 扩展级别 8 创建签名,或者根据 ISO 32000-2,还有另一种选择:您可以添加验证相关信息(如 CRL)在 PAdES 文档安全存储 DSS 结构中对已签名 PDF 进行增量更新。