Не удается подписать PDF с помощью метода CAdES, хотя подписание его с помощью PAdES успешно


Мы пытаемся подписать PDF-документ, используя метод Кейдса и примеры в dss-cookbook в качестве отправной точки, используя последнюю версию (4.6.RC1).

Следуя примеру из SignPdfPadesBDetached.java, мы успешно подписали PDF-документ, используя PAdES. Однако, поскольку нет примера для CAdES, мы попытались адаптировать приведенный выше пример для использования CAdES, но это не работает. В частности, сгенерированный PDF-документ имеет размер только 7k вместо ожидаемых 2,5 МБ и следующая ошибка отображается при попытке открыть файл PDF:
Введите описание изображения здесь
мы предполагаем, что 7k на самом деле является только подписью, Так что фактический документ не включен. Мы используем следующие настройки:

  • уровень подписи.CAdES_BASELINE_B
  • упаковка подписей.Отстраненный
  • Дигесталгоритм.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, поэтому нам пришлось сделать явную ссылку на него:
<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 , но документация не была настолько полезной, в соответствии с тем, что мы хотим выполнять.

Есть идеи, что здесь не так? Изменение упаковочной оболочки также не имеет значения. Является ли метод подписания с Кейдсом настолько другим, что пример PAdES не следует использовать в качестве руководства?
1 3

1 ответ:

в общем и целом,

Подписи PAdES - это специально профилированные подписи , встроенные в PDF. Таким образом, ваш подписанный PADES PDF может быть открыт в Adobe Reader, и Adobe Reader может распознать подпись, проверить ее и отобразить результат этого в своей панели подписи.

Подписи CAdES - это специально профилированные подписи, которые либо находятся в отдельном файле, либо содержат подписанные данные . Ни один из них эти форматы распознает Adobe Reader, в случае отдельного файла вы можете открыть исходный PDF, но читатель не видит подписи, в случае содержащегося PDF читатель либо не может открыть файл вообще, либо (поскольку читатель игнорирует некоторые ведущие и конечные дополнительные байты) считает подпись игнорируемой мусорной корзиной.

Вам нужна только библиотека PDF aware (как PDFBox) для подписей PAdES, для подписей CAdES PDF обрабатывается как общие данные байты.


в вашем случае, поэтому, т. е. для

  • уровень подписи.CAdES_BASELINE
  • упаковка подписей.Отстраненный

Ваш 7K действительно является простой подписью в отдельном файле, и вы должны сохранить или переслать как PDF, так и подпись, PDF для просмотра и подпись для проверки.

Таким образом,

В частности, сгенерированный PDF-документ имеет размер только 7k вместо ожидаемых 2,5 МБ ...

Мы предполагаем, что 7k на самом деле является только подписью, Так что фактический документ не включен.
Ваше предположение верно, и ваше поведение также правильно. Проблема в ваших ожиданиях.

некоторая путаница возможно, из-за того, что контейнер сигнатур, встроенный в PDF в случае подписи PAdES, при извлечении оказывается в формате CAdES, вызывается соответствующий подфильтр PDF Этси.можжевельники.разделенный , и что (по крайней мере, в самом последнем проекте под рукой) спецификация PDF 2.0 будет рассматривать подписи PAdES в разделе под названием "12.8.3.4 подписи CAdES, используемые в PDF (PDF 2.0)".

Тем не менее, если вы говорите о подписях PAdES, вы говорите о подписях ETSI AdES, интегрированных в PDF-файлы. Если вы говорите о подписях CAdES, вы говорите о подписях ETSI AdES CMS независимо от конкретного формата документа, который могут быть отделены от подписанных данных или которые могут обернуть их.


Согласно Вашим комментариям , в частности этому

Подписание PDF с помощью фильтра ETSI.CAdES.DETACHED является точным требованием

Вы в конце концов делаете не хотите создать подпись CAdES, а вместо этого подпись PAdES, точнее, вы хотите сделать это в соответствии с частью 3 : Pades Enhanced - PAdES-BES и Pades-EPES Profiles , а не согласно Часть 2: PAdES Основные - Профиль на основе стандарта ISO 32000-1, который использует подфильтров легко создавать, корректировать.pkcs7.обособленные и адбе.pkcs7.sha1 .

(чтобы получить требование прямо, это значениесубфильтра , а не значениефильтра .)

Это именно то, что примеры DSS cookbook SignPdfPadesB, SignPdfPadesBDetached, и SignPdfPadesBVisible должно быть все о:

  • все они в своем комментарии класса JavaDoc утверждают, что показывают , как подписывать PDF-документ с помощью PAdES-BASELINE-B ,
  • поваренная книга asciidoc / dss-документация.adoc для базовых профилей PAdES относится к ETSI TS 103 172,
  • И этот стандарт определяет:

    6 требования к соответствию уровню в

    Это положение определяет требования, которые должны выполнять подписи PAdES, претендующие на соответствие уровню B.

    Нынешнее положение устанавливает требования соответствия для краткосрочных электронных подписей. Этот пункт собственно профили PAdES-BES (подписи, которые не включают signature-policy-identifier) и PAdES-EPES (подписи которые действительно включают signature-policy-identifier) подписи.

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

К сожалению, я не могу сейчас проверить, что образцы делают то, что они утверждают, поскольку мои проекты eclipse dss все красные от проблем.

Если они это сделают, то, похоже, у вас в начале уже было то, что вы хотели:

Следующее пример из SignPdfPadesBDetached.java, мы успешно подписали PDF-документ с помощью PAdES.

Вы можете поделиться образцом PDF, подписанным с этим примером для анализа, чтобы быть уверенным.