在签名时在 pdf 中添加撤销详细信息

Posted

技术标签:

【中文标题】在签名时在 pdf 中添加撤销详细信息【英文标题】:add revocation detail in pdf while signing same 【发布时间】:2019-10-20 20:43:42 【问题描述】:

我已经使用附加在 pc 中的数字令牌对 pdf 进行了数字签名,使用库 itext sharp 附加相同,当我在 adobe 阅读器中打开它时,它显示无法执行撤销,当我看到详细信息时,它显示其中一个颁发者证书的吊销未检查错误:BER 解码时遇到错误。

我的普通签名 pdf 的路径:https://www.sendspace.com/file/vqgl53

作为一种解决方案,我认为如果我可以在文档中添加 CRL 信息本身(我的普通签名 pdf),那么我将不会遇到这个问题。所以我添加了这个答案中提到的代码:I want to sign a pdf document with ITextSharp and return ltv pdf enabled file

但我在网上遇到异常:addLtvForChain(null, ocspClient, crlClient, getCrlHashKey(crlBytes));

在子方法中getCrlHashKey 在第一行:X509Crl crl = new X509Crl(CertificateList.GetInstance(crlBytes));

异常说:

GetInstance 中的未知对象: Org.BouncyCastle.Asn1.DerApplicationSpecific 参数名称:obj

请进一步提出建议。

【问题讨论】:

该异常似乎表明 CRL 已损坏(或采用非标准格式 - 可以称为损坏的设计),因此相关提供商必须修复某些问题。稍后我会查看示例文档。 【参考方案1】:

扩展AdobeLtvEnabling

异常的原因是,对于一个证书,关联的 CRL 是 base64 编码的,AdobeLtvEnabling 类不期望这种编码(这里的期望是检索二进制版本,不需要解码)。

您可以按如下方式扩展 AdobeLtvEnabling 以也能够处理 base64 编码的 CRL:搜索 AdobeLtvEnabling 方法 addLtvForChain 并替换 CRL 处理循环

Console.WriteLine("  with 0 CRLs\n", crl.Count);
foreach (byte[] crlBytes in crl)

    validationData.crls.Add(crlBytes);
    addLtvForChain(null, ocspClient, crlClient, getCrlHashKey(crlBytes));

用这个:

Console.WriteLine("  with 0 CRLs\n", crl.Count);
foreach (byte[] crlBytes in crl)

    PdfName hashKey = null;
    byte[] bytes = null;
    try
    
        hashKey = getCrlHashKey(crlBytes);
        bytes = crlBytes;
    
    catch (Exception e)
    
        Console.WriteLine("  CRL decoding exception, assuming Base64 encoding, trying to decode - 0\n", e.Message);
        bytes = Convert.FromBase64String(new String(Encoding.Default.GetChars(crlBytes)));
        hashKey = getCrlHashKey(bytes);
    
    validationData.crls.Add(bytes);
    addLtvForChain(null, ocspClient, crlClient, hashKey);

不过是你的签名

虽然其他非根证书的吊销现在涉及嵌入式 CRL,但对于一个证书仍然存在问题,Adobe Reader 中“RCAI Class 2 (SAFESCRYPTONLINE_15) 的 SafeScrypt 子 CA”的吊销选项卡显示

CRL processing error
Issuer: cn=SafeScrypt CA 2014, houseIdentifier=II Floor, Tidel Park, street=No.4, Rajiv Gandhi Salai, Taramani, Chennai, st=Tamil Nadu, postalCode=600 113, ou=Certifying Authority, o=Sify Technologies Limited, c=IN
This update: 20180303183000Z
Next update: 20190303182959Z
CRL has expired or is not yet valid

确实,下一个更新值为 20190303182959Z 的 CRL 已过期,因此,如果没有适当的 POE,现在不能用于验证。因此,事实上,Adobe Reader 完全正确地指出,基于该 CRL(目前由 PKI 提供服务)它无法确定非撤销。

但它可以来自其他信息吗?好吧,OCSP 响应者的证书中有一个 AIA 属性,可以替代地使用。但是尝试使用它失败了,http://ocsp.safescrypt.com 目前不接受任何请求。所以这不是实际的选择。

总而言之,这使该 CA 的服务质量显得值得怀疑。如果此状态继续存在,您可能需要切换到其他 CA。

【讨论】:

我根据您的回答更新了我的代码,错误已解决并处理了异常,但主要目标是在 pdf 中附加 CRL 数据,这样当我打开它时它不应该在 adobe reader 中显示身份未知, 添加您的代码 Final signed pdf 后:sendspace.com/file/0zlpxq ,它仍然显示身份未知。 在您的问题中,您说问题是“在 adobe reader 中它显示无法执行撤销”,现在您说 “它不应该显示身份未知"。这是两个完全不同的问题! 不,“身份未知”背后的原因是因为在 adobe reader 中它显示无法执行撤销“-这两个问题是相互关联的。如果我错了,请帮助我解决相同的问题或纠正我。 好吧,如果您查看详细信息(证书查看器,选择 SAFESCRYPTONLINE_15,选项卡撤销,“遇到的问题...”,选项卡“文本视图”),您将看到“此更新:20180303183000Z下次更新:20190303182959Z CRL 已过期或尚未生效”。因此,SafeScrypt 为该 CA 证书提供的 CRL 仅在今年 3 月之前有效。因此,现在嵌入并没有帮助,而是要求 SafeScrypt 更新他们的基础设施。 感谢您的帮助我能够添加 LTV,请您帮助了解如何在启用 LTV 时添加证书预置时间戳。参考这个SS:zeta-uploader.com/en/307710765

以上是关于在签名时在 pdf 中添加撤销详细信息的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中使用弹性搜索 gem 时在哪里指定集群详细信息

如何在 PdfBox 中详细显示创建者的签名

MAC os x 10.8+ 代码签名证书详细信息

Java 获取PDF数字签名证书信息

为啥在查看证书详细信息之前,数字签名的可执行文件会被视为未签名

以编程方式获取已安装的应用程序详细信息以打开 pdf