4

最新バージョン (4.6.RC1) を使用して、開始点としてCAdES メソッドとdss-cookbookの例を使用して PDF ドキュメントに署名しようとしています。

の例に従って、SignPdfPadesBDetached.javaを使用して PDF ドキュメントに署名することに成功しましたPAdES。ただし、 の例がないためCAdES、上記の例を に適応させようとしましたCAdESが、うまくいきません。具体的には、生成された PDF ドキュメントのサイズが予想される 2.5 MB ではなく 7k しかなく、PDF を開こうとすると次のエラーが表示されます。使用する設定は次のとおりです。
ここに画像の説明を入力

  • SignatureLevel.CAdES_BASELINE_B
  • SignaturePackaging.DETACHED
  • DigestAlgorithm.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_Bおよびを使用しました)。PAdESService

SD-DSS プロジェクトは Maven Central リポジトリでホストされていないため、明示的に参照する必要があることに注意してください。

<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も試してみましたが、達成したいことによると、ドキュメントはあまり役に立ちませんでした。

ここで何が間違っているのですか?パッケージのエンベロープを変更しても違いはありません。CAdES で署名する方法は非常に異なるため、PAdES の例をガイドとして使用すべきではありませんか?

4

1 に答える 1

6

一般に、

PAdES署名は、PDF に埋め込まれた特別にプロファイルされた署名です。したがって、PAdES 署名付き PDF は Adob​​e Reader で開くことができ、Adobe Reader は署名を認識して検証し、その結果を署名パネルに表示できます。

CAdES署名は、個別のファイルにあるか、または署名済みデータを含む、特別にプロファイルされた署名です。これらの形式はいずれも Adob​​e Reader によって認識されません。別個のファイルの場合、元の PDF を開くことはできますが、リーダーは署名を認識しません。含まれている PDF の場合、リーダーはファイルをまったく開くことができないか、または (リーダーは、先頭と末尾の余分なバイトを無視します) は、署名を無視できるゴミと見なします。

PAdES 署名には PDF 対応ライブラリ (PDFBox など) のみが必要です。CAdES 署名の場合、PDF は一般的なデータ バイトのように扱われます。


したがって、あなたの場合、つまり

  • SignatureLevel.CAdES_BASELINE
  • SignaturePackaging.DETACHED

あなたの7Kは確かに別のファイルの単なる署名であり、PDFと署名の両方、表示用のPDFと検証用の署名の両方を保持または転送する必要があります.

したがって、

具体的には、生成された PDF ドキュメントのサイズは、予想される 2.5MB ではなく、わずか 7k です ...

実際のドキュメントが含まれないように、7k は実際には単なる署名であると想定しています。

あなたの仮定は正しく、動作も正しいです。あなたの期待が問題です。


PAdES 署名の場合に PDF に埋め込まれた署名コンテナーが抽出されると CAdES 形式であることが証明され、一致する PDF サブフィルターが ETSI.CAdES.detached と呼ばれ (少なくともPDF 2.0 仕様では、「 PDF (PDF 2.0) で使用される 12.8.3.4 CAdES 署名」というタイトルのセクションで PAdES 署名を扱います。

それにもかかわらず、PAdES 署名について話している場合は、PDF に統合された ETSI AdES 署名について話していることになります。CAdES署名について話している場合は、署名されたデータから切り離されたり、ラップされたりする可能性のある特定のドキュメント形式に依存しないETSI AdES CMS署名について話している.


あなたのコメントによると、特にこれは

ETSI.CAdES.DETACHEDフィルターを使用して PDF に署名することは、正確な要件です。

最終的にCAdES署名を作成するのではなく、代わりにPAdES署名を作成します。より正確には、パート 2: PAdES ではなく、パート 3: PAdES 拡張 - PAdES-BES および PAdES-EPES プロファイルに従って作成する必要があります。基本 - サブフィルターadbe.pkcs7.detachedおよびadbe.pkcs7.sha1を使用するISO 32000-1 に基づくプロファイル

(要件を明確にするために、それはフィルター値ではなく、サブフィルター値です。)

これはまさに dss クックブックの例SignPdfPadesBSignPdfPadesBDetached、およびSignPdfPadesBVisibleがすべてである必要があるものです。

  • それらはすべて JavaDoc クラスのコメントで、How to sign PDF Document with PAdES-BASELINE-Bを示していると主張しています。
  • PAdES ベースライン プロファイルのクックブック asciidoc/dss-documentation.adocは、ETSI TS 103 172 を参照しています。
  • そして、その規格は次のように規定しています。

    B レベル適合のための 6 つの要件

    この節は、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 に答える