C# 如何使用包含嵌入OCSP的iText对pdf进行签名

C# 如何使用包含嵌入OCSP的iText对pdf进行签名,c#,pdf,itext,itext7,sign,C#,Pdf,Itext,Itext7,Sign,第一个图像来自启用LTV的pdf签名。此文档不是我创建的。 在吊销信息中,它显示以下文本: 所选证书被认为是有效的,因为未使用嵌入签名中的联机证书状态协议(OCSP)响应验证该证书是否已被吊销。 我确实使用iText签署pdf文档,并且我还应用了OCSP OCSPVerifier OCSPVerifier=新的OCSPVerifier(null,null);//空,空>https://stackoverflow.com/questions/40765907/itextsharp-ocspcli

第一个图像来自启用LTV的pdf签名。此文档不是我创建的。

在吊销信息中,它显示以下文本:

所选证书被认为是有效的,因为未使用嵌入签名中的联机证书状态协议(OCSP)响应验证该证书是否已被吊销。

我确实使用iText签署pdf文档,并且我还应用了OCSP

OCSPVerifier OCSPVerifier=新的OCSPVerifier(null,null);//空,空>https://stackoverflow.com/questions/40765907/itextsharp-ocspclientbouncycastle-constructor-is-deprecated-whats-the-replacem
IOcspClient ocspClient=新OcspClientBouncyCastle(ocspVerifier);
var ocsp=ocspClient.GetEncoded(ocspCert,ocspRootCert,“http://www.myurl.com/aia/ocsp");
如果(ocsp==null)
Console.WriteLine(“oscp为空”);
其他的
Console.WriteLine(“ocsp不为空”);
//创建pkcs7容器
PdfPKCS7 sgn=新的PdfPKCS7(null,c.ToArray(),HashAlgorithm,false);
控制台写入线(“PdfPKCS7”);
字节[]sh=sgn.GetAuthenticatedAttributeBytes(哈希、ocsp、null、PdfSigner.CryptoStandard.CMS);
Console.WriteLine(“GetAuthenticatedAttributeBytes”);
//通过pkcs11硬件加载签名
字节[]extSignature=GetSignatureFromHashViaPkcs11(sh,pin);
Console.WriteLine(“GetSignatureFromHashViaPkcs11”);
sgn.SetExternalDigest(extSignature,null,DigestEncryptionAlgorithm);
Console.WriteLine(“SetExternalDigest”);
var ret=sgn.GetEncodedPKCS7(散列,tsaClient,ocsp,null,PdfSigner.CryptoStandard.CMS);
控制台写入线(“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证书检索OCSP响应

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

因此,

  • 您应该从签名者证书及其链开始

    e、 g.如果您的
    c
    被排序为一个链,则检索
    c[0],c[1]
    的OCSP响应,然后
    c[1],c[2]
    c[2],c[3]
    等直到信任锚

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

  • 然后,您必须检查这些OCSP响应,检索它们的签名者证书,构建它们的链,并对所有这些证书执行步骤1,但具有
    id pkix OCSP nocheck
    扩展名的证书除外

    注意,由证书本身签名的证书的OCSP响应显然一文不值


  • 请共享您的签名示例PDF,以便检查缺少的内容。当然:该链接显示“您请求的文件已被删除”。我已经将它再次上传到另一个服务:ok。成功了。我稍后再看。对于您提到的所有情况,我必须多次调用ocspClient.GetEncoded,对吗?如果是,如何组合生成的字节数组,以便能够在GetAuthenticatedAttributeBytes中进行设置?另一个问题:如何检查OCSP响应。这些是什么类型的?“如何组合生成的字节数组”-查看
    GetAuthenticatedAttributeBytes
    重载,有一个重载接受OCSP响应字节数组的集合。“如何检查OCSP响应。这些是什么类型的?”-请参阅。为了进行检查,您可以使用ASN.1转储工具。我使用的是旧版本的itext,它没有此重载。通过这种方法,我现在可以启用LTV。你是我的英雄。。。