当前位置: 首页 > 知识库问答 >
问题:

认证签名的LTV

戴浩初
2023-03-14

在过去的几周里,我一直在使用iText对PDF文件进行数字签名,根据我的理解,有两种方法可以将信息添加到PDF中,使其启用LTV:

>

  • 使用iText示例中提供的代码添加信息,此方法要求签名已经存在,因为DSS

    嵌入crl字节

    尽管第一种方法生成了一个整洁的pdf文件,但问题是它修改pdf文件以创建/附加条目,从而导致认证签名无效,第二个很好,但它会根据crl列表的大小大幅增加pdf大小(这也可能会增加超时时间)。

    综上所述,除了将信息嵌入签名本身之外,还有其他方法使认证签名LTV启用吗?有没有办法在签名时创建dds/vri字典?

    编辑:以下是评论中要求的更多信息:

    用于添加ltv信息的代码:

        public static void processDocumentLtv(String filePath) throws IOException, GeneralSecurityException, DocumentException {
    
        long startTime = System.currentTimeMillis();
    
        File original = new File(filePath);
        File temp = new File(filePath + ".ltv");
    
        PdfReader reader = new PdfReader(filePath);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(temp), '\0', true);
    
        LtvVerification ltvVerification = stamper.getLtvVerification();
        OcspClient ocspClient = new OcspClientBouncyCastle();
        AcroFields fields = stamper.getAcroFields();
        List<String> signatureNames = fields.getSignatureNames();
        String sigName = signatureNames.get(signatureNames.size() - 1);
        PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
        Certificate[] chain = pkcs7.getSignCertificateChain();
        X509Certificate x509certificate = pkcs7.getSigningCertificate();
    
        byte[] ocspResponse = ocspClient.getEncoded(x509certificate, CertificateUtils.getParent(x509certificate, chain), null);
        Collection<byte[]> crlBytes = CertificateUtils.fetchCrlBytes(x509certificate, chain);
        Collection<byte[]> ocspBytes = null;
    
        if (ocspResponse != null) {
            ocspBytes = new ArrayList<>();
            ocspBytes.add(ocspResponse);
        }
    
        ltvVerification.addVerification(sigName, ocspBytes, crlBytes, null);
    
        ltvVerification.merge();
    
        stamper.close();
        reader.close();
    
        Files.copy(temp.toPath(), original.toPath(), StandardCopyOption.REPLACE_EXISTING);
        temp.delete();
    
        logger.info("Took {}ms to do add the ltv information to the document.", (System.currentTimeMillis() - startTime));
    }
    

    文档示例:在尝试添加LTV数据之前:https://www.dropbox.com/s/79ll23ndt9mbh3g/pdf-sample-pre-ltv.pdf?dl=0

    运行上述代码后:https://www.dropbox.com/s/hjl73es6hrqspi3/pdf-sample-post-ltv.pdf?dl=0

    我使用的是AdobeReaderDCV15。017.20053作为我的PDF查看器。

  • 共有1个答案

    马欣荣
    2023-03-14

    我用OP的示例PDF进行了一些测试。事实上,Adobe Acrobat(Reader)不喜欢iText生成的PAdES-4 LTV添加到不允许更改认证的PDF中,这有点大脑分裂,两者都说

    文件作者不允许自应用此签名以来对本文件所做的某些更改。

    自应用此签名以来,未对本文件进行任何更改。

    (按“计算修改列表”后的“Adobe Acrobat签名属性”对话框)

    这种情况仍然存在,即使我删除了任何变化超过了LTV信息的添加(iText另外调整文档修改日期元数据),我最终甚至删除了添加的扩展条目ESIC(BaseVersion 1.7,ExtensionLevel 5),它向PDF查看器表明PAdES-4可以存在LTV内容,并且仅保留DSS参考内容。

    因此,Adobe Acrobat违反了PAdES-4规范,该规范要求

    DocMDP限制(见ISO 32000-1 112.8.2.2条款)不适用于包含DSS字典和相关VRI、Certs、CRL和OCSP的PDF文档的增量更新。

    (ETSI TS 102 778-4 V1.1.2 (2009-12)附件A.1文件安全存储)

    尽管Leonard Rosenthol(当时的Adobe PDF传道者)在iText邮件列表上保证

    我与我的工程师进行了核实,他们确实验证了DocMDP/Cert签名完全支持LTV。

    (回复日期为2012年1月17日的"验证认证(使用转换方法DocMDP)签名";下午3:15pm)

    我没有检查两个选项,虽然,可能Adobe Acrobat只遵守PAdES-4要求,如果认证签名是PAdES-3签名,或者如果已经在刚刚认证版本中的认证文档至少包含扩展条目ESIC(BaseVersion 1.7,ExtensionLevel5)。

    手边的文件包含一个传统的ISO 32000-1签名(可以被视为PAdES-2签名,但也可以被视为PAdES-2签名),并表明PDF版本1.3没有ESIC扩展条目。

    在最终将其称为AdobeAcrobat bug之前,我会尝试使用PAdES-3签名和ESIC扩展条目(或根据PAdES-4第4.4节的ADBE条目)进行更改。

    综上所述,除了将信息嵌入签名本身之外,还有其他方法使认证签名LTV启用吗?有没有办法在签名时创建dds/vri字典?

    PAdES-4增补内容是指文件先前版本中的签名,而不是同一版本中添加的签名。因此,虽然在技术上可以在同一版本中添加信息,但不能保证合格的PDF查看器会使用这些信息。

     类似资料:
    • 基本概念 Account Key, Account Secret: 用于标示开发者,获取方式见快速入门中生成新的云密钥图中的帐号密钥 App Key, App Secret: 用于标示开发者的App,获取的方式见快速入门中生成新的云密钥 Signature:根据Access Key和Secret Key和用户请求计算出的数字签名,用于验证用户身份。 Note 介绍签名算法时我们不区分Account

    • 开发者需要自己维护预签名下发服务器,由预签名下发服务器调用FDS SDK产生预签名链接 由于签名信息在url中,所有http请求请使用https协议 与请求签名认证的区别 对客户端要求低:开发者服务端计算请求签名 更安全:无须把密钥发布到设备上 签名信息保存在url中,而不是在http请求头部 用预签名URL完成分片上传 参考Presigned url分片上传示例 调试相关 参考 预签名链接使用相

    • 离线交易签名认证 如果你不想管理自己的以太坊客户端,或者不想向以太坊客户端提供诸如密码之类的钱包详细信息,那么就通过离线交易认证签名。 离线交易签名认证允许你在web3j中使用你的以太坊钱包签署交易,允许你完全控制你的私有凭据。然后,离线创建的交易可以被发送到网络上的任何以太坊客户端,只要它是一个有效的交易,它会将交易传播到其他节点。 如果需要,还可以执行进程外交易签名认证。这可以通过重写ECKe

    • 小程序调起支付后提示签名认证失败, JAVA 该如何生成paySign?

    • 我在理解SSL方面有点困难,即自签名vs认证。 首先,我的假设是自签名证书仍然会提示常见的浏览器警告消息吗? 其次,来自https域的数据不会传输到超文本传输协议域,对吗?所以如果我的网站在domain.com,我的api在api.domain.com,我需要两个证书,并为https设置它们? 最后,我注意到像StartSSL这样的网站上有免费的SSL证书。这让人觉得可疑,因为在其他网站上获得证书

    • 问题内容: 我想使用Bouncycastle生成一个简单的CMS签名。此代码有效! 但是,如何添加签名属性? 我想删除默认的签名属性并添加signature-policy-identifier。 文章非常受欢迎。 问题答案: 首先,您似乎正在使用最新版本的Bouncy Castle中不推荐使用的构造。要添加经过身份验证/签名的属性,您必须将它们打包到AttributeTable中,将签名的属性添加