Я пишу небольшую библиотеку, которая должна быть библиотекой высокого уровня (простой в использовании) для цифровой подписи PDF-файлов, созданных с помощью библиотеки WeasyPrint (https://github.com/Kozea/WeasyPrint).

Я уже наладил работу с самозаверяющими сертификатами, и теперь я работаю над адаптером для цифровых подписей из API Globalsign DSS (https://www.globalsign.com/en/resources/apis/api-documentation/digital-signing-service-api -documentation.html)

У меня все работает, кроме LTV (долгосрочной проверки), для которой требуется словарь DSS со списком информации OCSP и любых сертификатов в цепочке (чтобы справиться с отзывом).

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

Как мне включить функцию DSS, не аннулируя диапазон байтов?

Я несколько интенсивно изучал библиотеку iText, но она настолько абстрактна, что трудно разобрать фактически записываемые данные. Я все же позволил себе пометить iText, потому что это своего рода отраслевой стандарт работы с цифровыми подписями в PDF-файлах.

0
hejsan 5 Апр 2020 в 20:36
1
Это зависит от конкретного профиля LTV, который вы хотите создать. Чтобы получить что-то, что Adobe Reader считает «поддерживающим LTV», вам не нужна отметка времени. Если вам нужна подпись PAdES Baseline LTA, вам обычно нужны две метки времени. Как упоминалось ранее, ваше описание того, что вы делаете и чего хотите, очень расплывчато.
 – 
mkl
10 Апр 2020 в 10:23
1
В своем ответе вы ссылаетесь на код. Попозже попробую посмотреть.
 – 
mkl
10 Апр 2020 в 10:29
1
Однако есть вероятность, что это продлится до Пасхи.
 – 
mkl
10 Апр 2020 в 16:12
1
Я быстро просмотрел ваш файл. Одна очевидная ошибка: Содержимое словаря меток времени документа подготовлено для строки в шестнадцатеричном кодировании (что нормально), но вы помещаете туда метку времени без шестнадцатеричной кодировки! Это невозможно проанализировать, поэтому в лучшем случае отметка времени вашего документа будет проигнорирована, а в худшем случае процессоры PDF не смогут прочитать ваш PDF-файл целиком. Это объясняет, почему «Документ первого уровня не отображается в Adobe Reader».
 – 
mkl
10 Апр 2020 в 19:30
1
Отметка времени документа должна быть значением поля подписи, на которое, в свою очередь, должна быть ссылка, прямо или косвенно, из словаря AcroForm в каталоге документов. Отметка времени вашего документа полностью не подключена.
 – 
mkl
12 Апр 2020 в 22:43

1 ответ

Я понял это благодаря этому красиво названному документу: электронные подписи и инфраструктуры (ESI); Расширенные профили электронной подписи в формате PDF; Часть 4. Долгосрочная перспектива PAdES – профиль PAdES-LTV Название может быть многословным беспорядком, но документ на самом деле очень краткий и полезный для чтения.

DSS можно добавить после исходного диапазона байтов, также добавив временную метку, которая берет дайджест другого диапазона байтов, включающего весь файл, включая DSS, в конце файла. Вы должны включить расширение, чтобы это работало, см. «Глава 4.4 Словарь расширений». Более подробная информация содержится в связанном документе.

Я думаю, стоит упомянуть, что я обнаружил некоторые синтаксические ошибки в своем PDF-файле с помощью утилит Apache PDFBox. Хотел бы я найти его раньше.

Если вам интересно, я опубликовал библиотеку на github: https://github.com/hejsan/WeasySign. Он уже работает, но требует доработки.

0
hejsan 12 Апр 2020 в 14:59
Упомянутая вами ETSI TS была исходным описанием механизмов PAdES LTV. Между тем есть более новые и доработанные, и как TS, и как EN.
 – 
mkl
10 Апр 2020 в 10:26
Это был единственный, который я нашел, чтобы иметь реальные примеры разметки PDF. Не могли бы вы связать более новый? Я просматриваю их сайт и вижу очень длинный список вариантов: etsi.org/…
 – 
hejsan
10 Апр 2020 в 13:41
1
Спецификации PAdES теперь можно найти в ETSI EN 319 142-1 и ETSI EN 319 142-2. В нем может быть меньше примеров разметки pdf, но здесь также объясняются более актуальные базовые профили.
 – 
mkl
10 Апр 2020 в 19:45