如何解决如何使用包含嵌入的 OCSP 的 iText 签署 pdf
第一张图片来自启用 LTV 的 pdf 签名。本文档不是我创建的。
在吊销信息中,显示如下文字:
选定的证书被认为是有效的,因为它没有被吊销,因为它没有使用嵌入在签名中的在线证书状态协议 (OCSP) 响应进行验证。
我确实使用 iText 签署了 pdf 文档,并且我还应用了 OCSP。
OCSPVerifier ocspVerifier = new OCSPVerifier(null,null); // null,null >https://stackoverflow.com/questions/40765907/itextsharp-ocspclientbouncycastle-constructor-is-deprecated-whats-the-replacem
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,DigestEncryptionAlgorithm);
Console.WriteLine("SetExternalDigest");
var ret = sgn.GetEncodedPKCS7(hash,tsaClient,PdfSigner.CryptoStandard.CMS);
Console.WriteLine("GetEncodedPKCS7");
Console.WriteLine($"IsTsp : {sgn.IsTsp()}");
在吊销信息中,显示如下文字:
所选证书被认为是有效的,因为它没有被撤销,因为它没有使用在线获得的在线证书状态协议 (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 响应,检索他们的签名者证书,构建他们的链,并对所有这些除了具有
id-pkix-ocsp-nocheck
扩展名。请注意,由该证书本身签署的证书的 OCSP 响应显然一文不值......
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。