Как включить LTV для подписи метки времени и запретить изменение pdf? - PullRequest
0 голосов
/ 14 ноября 2018

Я подписываю PDF с цифровым сертификатом, используя iText. Теперь я могу подписать и добавить LTV, но CertificateLevel может быть просто:

signatureAppearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS);

Я просто хочу установить PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED. Конечный результат должен выглядеть так:

enter image description here

sap.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
MakeSignature.signDetached(signatureAppearance, privateKey, "SHA-512", chain, null, ocspClient, tsaClient, 0, MakeSignature.CryptoStandard.CADES);

Если я использую вышеуказанный код для подписи, то использование AdobeLtvEnabling.java для добавления LTV приведет к тому, что подпись будет недействительной при использовании проверки ACROBAT, поскольку файл изменяет неизменяемый файл PDF при добавлении LTV. Итак, что я могу сделать, чтобы приблизиться к конечному эффекту.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Я использую itextsharp, и я думаю, что следующее будет полезно и для вашего кода Java.

Если вы вызовете MakeSignature.SignDetached с CrlClient и OcspClient (вместо передачи null в качестве параметра), вы получите подпись с поддержкой LTV после первого шага. Тогда вам не нужно делать второй шаг, чтобы добавить метку времени документа после.

var stamper = PdfStamper.CreateSignature(reader, stream, '\0', null, true);
var appearance = stamper.SignatureAppearance;
appearance.CertificationLevel = PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED;
...
var privateKey = ...
var chain = ...
var crlClient = new CrlClientOnline(chain);
var ocspClient = new OcspClientBouncyCastle();
var tsaClient = new TSAClientBouncyCastle("http://....");

MakeSignature.SignDetached(appearance, privateKey, chain, 
    new[] { crlClient }, 
    ocspClient,
    tsaClient, 
    0, 
    CryptoStandard.CMS);
stamper.Close();

Надеюсь, это работает для вас.

0 голосов
/ 15 ноября 2018

Чтобы получить результат, подобный вашему снимку, т. Е. Как «Изменения не разрешены», так и «Подпись LTV включена» без какой-либо более поздней подписи или отметки времени документа, вам необходимо

  • либо уже включитьвсе материалы LTV, которые валидатор Adobe требует в вашей оригинальной подписанной ревизии
  • или в режиме подписи, который позволяет добавлять материалы LTV, несмотря на то, что изменения не допускаются.

К сожалению, последнееКажется, вариант еще не поддерживается должным образом Adobe Acrobat Reader.

Подробнее см. в следующих разделах.

Включить весь материал LTV в оригинальную подписанную ревизию

Прежде всегоэто не всегда возможно.Если вы хотите, чтобы материал LTV был в оригинальной подписанной ревизии, он должен быть частью подписанных данных, поэтому вы должны собрать его до подписания .Однако во многих установках, использующих службы удаленной подписи, вы не знаете, какой именно сертификат подписи будет использоваться до фактического запроса подписи.

Если это возможно, то есть, если вы знаете сертификат подписи заранееВы можете использовать класс AdobeLtvEnabling из этого ответа о переполнении стека , чтобы включить такую ​​информацию:

PdfStamper stamper = PdfStamper.createSignature(...);

AdobeLtvEnabling adobeLtvEnabling = new AdobeLtvEnabling(stamper);
OcspClient ocsp = new OcspClientBouncyCastle();
CrlClient crl = new CrlClientOnline();
adobeLtvEnabling.addLtvForChain(YOUR_SIGNER_CERTIFICATE, ocsp, crl, PdfName.A);
adobeLtvEnabling.outputDss();

[...preparing your signature...]
MakeSignature.signDetached(...);

( CreateSignatureComodo test testCreateLtvNoChangesAllowedCertification)

Для этого вам, возможно, придется сделать методы AdobeLtvEnabling addLtvForChain и outputDss общедоступными, поскольку AdobeLtvEnabling изначально не предназначалось для использования таким образом.

Результат:

screen shot

Используйте режим подписи, который позволяет добавлять материал LTV, но не более

В качестве альтернативы вы можете подписать свой PDFтаким образом, что позднее возможно добавление материала LTV, несмотря на сертификацию «изменения не разрешены».

Для начала необходимо использовать механизм, впервые указанный для подписей PAdES, если вы хотите добавитьLТВ материал в PDF после подписи, для которого он предназначен.Хотя этот механизм был включен в ИСО 32000-2, он не доступен в простом контексте ИСО 32000-1.Поскольку ваш скриншот относится к Adobe Acrobat, это не должно быть проблемой для вас.

Этот механизм - хранилище документов .И класс iText LtvVerification, и класс AdobeLtvEnabling из этот ответ о переполнении стека заполняют такие хранилища в PDF.

Разрешено ли добавлять эти хранилища безопасности документов, несмотря насертификация "без изменений"?- Это зависит ...

Если ваш PDF - это PDF-2.0: да.ISO 32000-2 характеризует изменения, разрешенные или запрещенные какой-либо сертификацией, такой как:

Изменения в PDF, которые являются инкрементными обновлениями, которые включают только данные, необходимые для добавления DSS 12.8.4.3, «Document Security Store».(DSS) "и / или метки времени документа 12.8.5," Словарь меток времени документа (DTS) "к документу не должен рассматриваться как изменение документа, как определено в следующих вариантах.

(ISO 32000-2, Таблица 257 - Записи в словаре параметров преобразования DocMDP)

Если ваш PDF является PDF-1.x с включенными расширениями PAdES: да.ETSI EN 319 142-1 требует

ограничения DocMDP (см. ISO 32000-1 1 , пункт 12.8.2.2) не должны применяться к инкрементным обновлениям документа PDF, содержащего DSSсловарь и связанные VRI, Certs, CRL и OCSP.

...

При оценке ограничений DocMDP (см. ISO 32000-1 1 , пункт 12.8.2.2)наличие элемента словаря меток времени документа следует игнорировать.

(ETSI EN 319 142-1 V1.1.1, раздел 5.4 Аттестационные данные и атрибуты архивных данных валидации)

Если ваш PDF-файл представляет собой обычный PDF-1.x, однако: нет!

Если вы хотите использовать эту опцию и добавить информацию о LTV после подписания, убедитесь, что ваш изначально сертифицированный PDF-файлявляется PDF-2 или имеет как минимум расширения PAdES.

Хотя iText 5 не поддерживает PDF-2, при создании подписи в стиле PAdES добавляются расширения PAdES.

Таким образом, если вы сертифицируете стиль PAdES, вы сможете включить LTV-подпись, даже еслисертификация «изменения не допускаются».

Поддержка Adobe Acrobat Reader DC 2019.008.20080

Проведя некоторые тесты, расширяя разрешенный без изменений сертифицированный PDF-файл только с информацией LTV, при этом PDF-файл либопомеченный как PDF-1.7 с соответствующими расширениями ETSI и Adobe или как PDF-2.0, похоже, что Adobe Acrobat еще не полностью поддерживает ни ETSI EN 319 142-1, ни ISO 32000-2: во всех тестах сертификация считалась нарушенной, см., CreateSignatureComodo test testCreateNoChangesAllowedCertificationAndLtv.

Таким образом, в настоящее время, чтобы получить документ с разрешенной LTV сертификацией, не допускающей изменений, и чтобы Adobe Acrobat распознал это, нужно иметь толькопервый вариант выше, то есть включение всех материалов LTV в оригинальную подписанную ревизию.

Обходным путем может быть создание сертификата с разрешенным заполнением формы, затем добавление информации LTV, а затем подписание с другим (утверждение) подпись, которая изменяет документ на «без изменений» через свой словарь блокировки поля и преобразование FieldMDP, ср. CreateSignatureComodo test testCreateCertificationAndLtvAndNoChangesAllowed.Поскольку инкрементное обновление этой подписи может быть удалено знающим человеком, это далеко не идеально.

Результат для обхода:

screen shot

...