如何使用包含嵌入式 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 证书检索响应。
您需要的是所有涉及的证书及其链的吊销信息,但不包括信任锚。
因此,
您应该从签署者证书及其链开始;
例如如果您的 c
被排序为链,检索 c[0], c[1]
的 OCSP 响应,然后是 c[1], c[2]
、c[2], c[3]
等,直到信任锚;
如果您的签名包含时间戳,也对 TSA 证书执行步骤 1;
然后你必须检查那些 OCSP 响应,检索他们的签名者证书,构建他们的链,并为所有这些 除了 证书执行步骤 1有 id-pkix-ocsp-nocheck
扩展名。
注意,由该证书本身签名的证书的 OCSP 响应显然不值一毛钱...
第一张图片来自启用了 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 证书检索响应。
您需要的是所有涉及的证书及其链的吊销信息,但不包括信任锚。
因此,
您应该从签署者证书及其链开始;
例如如果您的
c
被排序为链,检索c[0], c[1]
的 OCSP 响应,然后是c[1], c[2]
、c[2], c[3]
等,直到信任锚;如果您的签名包含时间戳,也对 TSA 证书执行步骤 1;
然后你必须检查那些 OCSP 响应,检索他们的签名者证书,构建他们的链,并为所有这些 除了 证书执行步骤 1有
id-pkix-ocsp-nocheck
扩展名。注意,由该证书本身签名的证书的 OCSP 响应显然不值一毛钱...