如何使用包含嵌入式 OCSP 的 iText 签署 pdf

Howto sign a pdf using iText which contains an OCSP which is embedded

第一张图片来自启用了 LTV 的 pdf 签名。这个文档不是我创建的。

在吊销信息中,显示如下文字:

所选证书被视为有效,因为它尚未被吊销,因为使用签名中嵌入的在线证书状态协议 (OCSP) 响应进行了验证。

我确实使用 iText 签署了一个 pdf 文档,我也申请了 OCSP。

OCSPVerifier ocspVerifier = new OCSPVerifier(null, null); // null,null >
IOcspClient ocspClient = new OcspClientBouncyCastle(ocspVerifier);
var ocsp = ocspClient.GetEncoded(ocspCert,ocspRootCert, "http://www.myurl.com/aia/ocsp");

if (ocsp == null)
    Console.WriteLine("oscp is null");
else
    Console.WriteLine("ocsp is not null");

//Create the pkcs7 container
PdfPKCS7 sgn = new PdfPKCS7(null, c.ToArray(), HashAlgorithm, false);
Console.WriteLine("PdfPKCS7");
byte[] sh = sgn.GetAuthenticatedAttributeBytes(hash, ocsp, null, PdfSigner.CryptoStandard.CMS);
Console.WriteLine("GetAuthenticatedAttributeBytes");

//Load the signature via pkcs11 hardware
byte[] extSignature = GetSignatureFromHashViaPkcs11(sh, pin);
Console.WriteLine("GetSignatureFromHashViaPkcs11");
sgn.SetExternalDigest(extSignature, null, DigestEncryptionAlgorithm);
Console.WriteLine("SetExternalDigest");
var ret = sgn.GetEncodedPKCS7(hash, tsaClient, ocsp, null, PdfSigner.CryptoStandard.CMS);
Console.WriteLine("GetEncodedPKCS7");

Console.WriteLine($"IsTsp : {sgn.IsTsp()}");

在这种情况下,生成的签名显示为有效但 LTV 未启用:

在吊销信息中,显示如下文字:

所选证书被认为是有效的,因为它没有被吊销,因为使用在线获得的在线证书状态协议 (OCSP) 实时验证它。

我的猜测是这种差异是导致 LTV 问题的原因。我如何使用 iText 设置 OCSP 以便嵌入而不是在线获取?

您添加一个 OCSP 响应,即您在此处检索到的响应:

var ocsp = ocspClient.GetEncoded(ocspCert,ocspRootCert, "http://www.myurl.com/aia/ocsp");

但这不会为您的签署者证书检索 OCSP 响应,而是为您的 PKI 的 OCSP 证书检索响应。

您需要的是所有涉及的证书及其链的吊销信息,但不包括信任锚。

因此,

  1. 您应该从签署者证书及其链开始;

    例如如果您的 c 被排序为链,检索 c[0], c[1] 的 OCSP 响应,然后是 c[1], c[2]c[2], c[3] 等,直到信任锚;

  2. 如果您的签名包含时间戳,也对 TSA 证书执行步骤 1;

  3. 然后你必须检查那些 OCSP 响应,检索他们的签名者证书,构建他们的链,并为所有这些 除了 证书执行步骤 1有 id-pkix-ocsp-nocheck 扩展名。

    注意,由该证书本身签名的证书的 OCSP 响应显然不值一毛钱...