Не удается подписать 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
) классы.
<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 , но документация не была настолько полезной, в соответствии с тем, что мы хотим выполнять.
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
должно быть все о:К сожалению, я не могу сейчас проверить, что образцы делают то, что они утверждают, поскольку мои проекты eclipse dss все красные от проблем.
- все они в своем комментарии класса 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
) подписи.Если они это сделают, то, похоже, у вас в начале уже было то, что вы хотели:
Следующее пример из SignPdfPadesBDetached.java, мы успешно подписали PDF-документ с помощью PAdES.
Вы можете поделиться образцом PDF, подписанным с этим примером для анализа, чтобы быть уверенным.