4

我们正在尝试使用 CAdES 方法和dss-cookbook中的示例作为起点,使用最新版本 (4.6.RC1) 签署 PDF 文档。

按照 中的示例SignPdfPadesBDetached.java,我们已经成功地使用PAdES. 但是,由于没有 的示例CAdES,我们尝试将上面的示例改编为使用CAdES,但它不起作用。具体来说,生成的 PDF 文档的大小仅为 7k,而不是预期的 2.5MB,并且在尝试打开 PDF 时显示以下错误:我们假设 7k 实际上只是签名,因此不包括实际文档。我们使用的设置是:
在此处输入图像描述

  • SignatureLevel.CAdES_BASELINE_B
  • SignaturePackaging.DETACHED
  • 摘要算法.SHA256

而亲戚的方法代码目前是这样的:

public static void signPdfWithCades(DSSDocument toSignDocument) {

    LOG.info("Signing PDF with CADES B");

    try {
        AbstractSignatureTokenConnection signingToken = new Pkcs12SignatureToken("password", KEYSTORE_PATH);
        DSSPrivateKeyEntry privateKey = signingToken.getKeys().get(0);

        // Preparing parameters for the CAdES signature
        CAdESSignatureParameters parameters = new CAdESSignatureParameters();
        // We choose the level of the signature (-B, -T, -LT, -LTA).
        parameters.setSignatureLevel(SignatureLevel.CAdES_BASELINE_B);
        // We choose the type of the signature packaging (ENVELOPING, DETACHED).
        parameters.setSignaturePackaging(SignaturePackaging.DETACHED);
        // We set the digest algorithm to use with the signature algorithm. You must use the
        // same parameter when you invoke the method sign on the token. The default value is
        // SHA256
        parameters.setDigestAlgorithm(DigestAlgorithm.SHA256);

        // We set the signing certificate
        parameters.setSigningCertificate(privateKey.getCertificate());
        // We set the certificate chain
        parameters.setCertificateChain(privateKey.getCertificateChain());

        // Create common certificate verifier
        CommonCertificateVerifier commonCertificateVerifier = new CommonCertificateVerifier();
        // Create PAdES xadesService for signature
        CAdESService service = new CAdESService(commonCertificateVerifier);

        // Get the SignedInfo segment that need to be signed.
        ToBeSigned dataToSign = service.getDataToSign(toSignDocument, parameters);

        // This function obtains the signature value for signed information using the
        // private key and specified algorithm
        DigestAlgorithm digestAlgorithm = parameters.getDigestAlgorithm();
        SignatureValue signatureValue = signingToken.sign(dataToSign, digestAlgorithm, privateKey);

        // We invoke the cadesService to sign the document with the signature value obtained in
        // the previous step.
        DSSDocument signedDocument = service.signDocument(toSignDocument, parameters, signatureValue);

        LOG.info("Signed PDF size = " + signedDocument.getBytes().length);

        //We use the DSSUtils to Save to file
        DSSUtils.saveToFile(signedDocument.openStream(), "target/signedPdfCadesBDetached.pdf");
    } catch (Exception e) {
        LOG.error(e.getMessage(), e);
    }
}

对应的签名方法与PAdES上面类似,调整为PAdES(也就是我们那里使用了PAdESSignatureParameters,SignatureLevel.PAdES_BASELINE_BPAdESService)类。

请注意,SD-DSS 项目未托管在 Maven 中央存储库中,因此我们必须明确引用它:

<repositories>
    <repository>
        <id>europa</id>
        <url>https://joinup.ec.europa.eu/nexus/content/groups/public/</url>
    </repository>
</repositories>

此外,我相信我们在以下内容中包含了所有必需/相应的依赖项pom.xml

<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-token</artifactId>
    <version>4.6.RC1</version>
</dependency>
<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-pades</artifactId>
    <version>4.6.RC1</version>
</dependency>
<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-cades</artifactId>
    <version>4.6.RC1</version>
</dependency>
<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-document</artifactId>
    <version>4.6.RC1</version>
</dependency>

在此之前,我们也尝试过PDFBox,但根据我们想要完成的任务,文档并没有那么有用。

知道这里有什么问题吗?改变包装 ENVELOPING 也没有区别。使用 CAdES 签名的方法是否如此不同以至于不应将 PAdES 示例用作指南?

4

1 回答 1

6

一般来说,

PAdES签名是嵌入到 PDF中的专门配置的签名。因此,您的 PAdES 签名 PDF 可以在 Adob​​e Reader 中打开,Adobe Reader 可以识别、验证签名并在其签名面板中显示签名结果。

CAdES签名是专门配置的签名,它们要么位于单独的文件中,要么包含签名数据。Adobe Reader 无法识别这两种格式,如果是单独的文件,您可以打开原始 PDF,但 Reader 看不到签名,如果是包含的 PDF,Reader 要么根本无法打开文件,要么(作为阅读器忽略一些前导和尾随的额外字节)认为签名可忽略的垃圾。

对于 PAdES 签名,您只需要一个 PDF 感知库(如 PDFBox),对于 CAdES 签名,PDF 被视为通用数据字节。


因此,在您的情况下,即

  • SignatureLevel.CAdES_BASELINE
  • SignaturePackaging.DETACHED

您的 7K 确实只是单独文件中的签名,您必须保留或转发 PDF 和签名、用于查看的 PDF 和用于验证的签名。

因此,

具体来说,生成的 PDF 文档的大小仅为 7k,而不是预期的 2.5MB ...

我们假设 7k 实际上只是签名,因此不包括实际文档。

你的假设是正确的,行为也是正确的。你的期望是问题。


一些混淆可能是由于以下事实:在 PAdES 签名的情况下嵌入到 PDF 中的签名容器在提取时证明是 CAdES 格式,匹配的 PDF 子过滤器称为ETSI.CAdES.detached,并且(至少在手头的最新草案中)PDF 2.0 规范将在标题为“ PDF 中使用的 12.8.3.4 CAdES 签名(PDF 2.0) ”的部分中处理 PAdES 签名。

尽管如此,如果您谈论的是 PAdES 签名,那么您谈论的是集成在 PDF 中的 ETSI AdES 签名。如果您谈论的是 CAdES 签名,那么您谈论的是独立于特定文档格式的 ETSI AdES CMS 签名,该文档格式可能与签名数据分离或包装它们。


根据你的意见,特别是这个

使用过滤器签署 PDFETSI.CAdES.DETACHED是确切的要求

您最终不想创建CAdES签名,而是创建PAdES签名,更确切地说,您希望根据第 3 部分:PAdES 增强 - PAdES-BES 和 PAdES-EPES 配置文件而不是根据第 2 部分:PAdES基本 - 基于 ISO 32000-1 的配置文件,它使用子过滤器adbe.pkcs7.detachedadbe.pkcs7.sha1

(为了明确要求,即过滤器值,而不是过滤器值。)

这正是 dss 食谱示例SignPdfPadesBSignPdfPadesBDetached、 和SignPdfPadesBVisible应该的全部内容:

  • 他们都在他们的 JavaDoc 类评论中声称展示了如何使用 PAdES-BASELINE-B 签署 PDF 文档
  • PAdES 基线配置文件的说明书 asciidoc/dss-documentation.adoc参考 ETSI TS 103 172,
  • 该标准规定:

    6 B级一致性要求

    本条款定义了声称符合 B 级的 PAdES 签名必须满足的要求。

    当前条款规定了短期电子签名的合规要求。该条款实际上描述了 PAdES-BES(不包含的签名signature-policy-identifier)和 PAdES-EPES(包含的signature-policy-identifier签名)签名。

    ( ETSI TS 103 172 V2.1.1 (2012-03) )

不幸的是,我现在无法验证这些示例是否符合他们声称的那样,因为我的 eclipse dss 项目都出现问题。

但是,如果他们这样做了,看起来你一开始就已经拥有了你想要的东西:

按照 SignPdfPadesBDetached.java 中的示例,我们已经使用 PAdES 成功签署了 PDF 文档。

您可以共享使用该示例签名的示例 PDF 以确保进行分析。

于 2016-01-01T15:19:56.713 回答