Неожиданные значения диапазона байтов, определяющие область подписанных данных при подписании PDF-файла

Я использую модифицированную версию этой библиотеки: https://github.com/vbuch/node-signpdf#readme в приложении angular, чтобы подписать PDF-файл подписью, созданной в другом месте. Когда я открываю подписанный pdf с помощью foxit reader, подпись недействительна со следующим сообщением:

Неожиданные значения диапазона байтов, определяющие область подписанных данных

Есть идеи, в чем может быть проблема?

Вот файл: https://drive.google.com/file/d/1eS2waysotpAx6VtHMNvhGvl3wqgiyoT7/view?usp=sharing


person Cyrill    schedule 12.11.2020    source источник
comment
В вашем файле примера снова есть поле подписи с именем, начинающимся с байта 0x00, и поэтому оно не отображается в Adobe Reader.   -  person mkl    schedule 12.11.2020
comment
Да, я еще не решил эту проблему. У вас есть идея, почему я получаю это сообщение?   -  person Cyrill    schedule 12.11.2020
comment
Неожиданные значения диапазона байтов, определяющие область подписанных данных. На самом деле я не могу это воспроизвести. Здесь Foxit просто говорит, что подпись недействительна. Это имеет смысл, потому что вы забыли декодировать строку подписи с помощью base64, прежде чем вводить ее в PDF - PDF требует встроенных контейнеров подписи в формате DER.   -  person mkl    schedule 12.11.2020
comment
Большое спасибо за ваш комментарий. Я попытался применить ваш комментарий. Теперь я больше не получаю ошибку о диапазоне байтов, но получаю новые ошибки: документ был изменен или поврежден с момента применения подписи. Идентификация подписывающей стороны недействительна, поскольку срок ее действия истек или еще не действителен. и Подпись включает встроенную временную метку, но ее не удалось проверить. Не уверен, что сейчас делаю правильно. Это новый файл: drive.google.com/file/ d/1vsa7thwCsi04r68cdcIsfJG7cT2__-d9/   -  person Cyrill    schedule 16.11.2020


Ответы (1)


Первый пример документа

Мне не удалось воспроизвести сообщение об ошибке «Неожиданные значения диапазона байтов, определяющие область подписанных данных» с первый пример документа, Foxit просто пожаловался, что подпись недействительна. И это действительно так, потому что вы забыли декодировать строку подписи с помощью base64, прежде чем вводить ее в PDF - PDF требует встроенных контейнеров подписи в формате DER.

Второй пример документа

Второй пример документа был опубликован в комментарии:

Теперь я больше не получаю ошибку о диапазоне байтов, но получаю новые ошибки: документ был изменен или поврежден с момента применения подписи. Идентификация подписывающей стороны недействительна, поскольку срок ее действия истек или еще не действителен. и Подпись включает встроенную временную метку, но ее не удалось проверить. Не уверен, что сейчас делаю правильно. Это новый файл: https://drive.google.com/file/d/1vsa7thwCsi04r68cdcIsfJG7cT2__-d9/view?usp=sharing

Действительно, контейнер подписи теперь вводится в формате DER, поэтому Foxit Reader может его проверить. Относительно новых сообщений об ошибках:

Документ был изменен или поврежден с момента применения подписи. Здесь это указывает на несоответствие значения дайджеста.

Вычисление и извлечение рассматриваемых значений дайджеста показывает, что значение дайджеста SHA256 диапазонов байтов со знаком документа равно

6CB28A1F84A85A820908B657A967BFE21C1BA7304D39AE2C8D64F9A15E5BFDB4

в то время как атрибут дайджеста сообщения в контейнере подписи содержит

75C31E9E948D41DE19F668CF4A5BE28128CB0BE8D1E4502A795FF9CA9FE54639

поэтому ваша подпись действительно не соответствует подписанным диапазонам байтов.

Интересно, однако, что это точно такой же дайджест, который был подписан в контейнере подписи в первом файле. На самом деле весь контейнер подписи идентичен. Судя по всему, вы просто повторно использовали контейнер подписи, полученный вами для предыдущего теста. Поскольку время подписания в новом документе отличается, это не сработает, однако вам придется заново вычислять дайджест подписанных диапазонов байтов и запрашивать для него подпись.

Тем не менее, даже для вашего первого документа этот дайджест неверен. Итак, у вас, по-видимому, есть проблема с вычислением значений дайджеста.

Идентификатор подписывающей стороны недействителен, поскольку срок его действия истек или еще не действителен. Я не получаю это сообщение об ошибке даже после обновления Foxit Reader вручную. Сначала мне сообщили, что сертификат не привязан к якорю доверия, и после явного доверия корневому сертификату я получаю Идентификатор подписывающей стороны действителен. Вы выбрали какие-то нестандартные настройки в своем Foxit Reader? Или дата вашего локального компьютера полностью отключена?

Подпись включает встроенную отметку времени, но ее невозможно проверить. Я тоже это понял, но здесь мне снова нужно было просто доверять корневому сертификату сертификата TSA, чтобы начать работу.

Комментарии

В комментариях вы спросите:

Где я могу найти атрибут дайджеста сообщения в подписи?

Атрибут дайджеста сообщения — это подписанный атрибут одиночного SignerInfo в контейнере подписи.

Если вы проверяете свой контейнер подписи с помощью средства просмотра ASN.1 (например, http://lapo.it/asn1js/) поищи это

SEQUENCE (2 elem)
  OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
  SET (1 elem)
    OCTET STRING (32 byte) 75C31E9E948D41DE19F668CF4A5BE28128CB0BE8D1E4502A795FF9CA9FE54639

Если вы хотите понять детали того, что видите, изучите RFC 5652 и спецификации оттуда.

И как я могу явно доверять корневому сертификату?

Для сертификата подписывающей стороны в Foxit Reader откройте диалоговое окно Свойства подписи, выберите Показать сертификат, выберите сертификат, которому вы хотите доверять (корневой ЦС/промежуточный ЦС/конечный объект), откройте на вкладке Доверие и нажмите Добавить в доверенные сертификаты.

Для сертификата TSA в Foxit Reader откройте диалоговое окно Свойства подписи, внизу нажмите Дополнительные свойства, выберите Показать сертификат в сведениях о метке времени, выберите сертификат, которому вы хотите доверять (корневой ЦС / промежуточный ЦС / конечный объект), откройте вкладку Доверие и нажмите Добавить в доверенные сертификаты.

person mkl    schedule 16.11.2020
comment
Где я могу найти атрибут дайджеста сообщения в подписи? - person Cyrill; 16.11.2020
comment
И как я могу явно доверять корневому сертификату? - person Cyrill; 16.11.2020
comment
Доверие к сертификату сработало, большое спасибо. У меня все еще есть проблемы с хешем. Теперь я учитываю время подписания, но подпись все еще недействительна. Как вы вычислили хэш файла? (6CB28A1F84A85A820908B657A967BFE21C1BA7304D39AE2C8D64F9A15E5BFDB4) - person Cyrill; 17.11.2020
comment
Как вы рассчитали хэш файла? — Я использовал небольшую программу на Java, основанную на iText, для анализа вашего PDF-файла. - person mkl; 18.11.2020
comment
Проблема действительно заключалась в том, что хэш был неправильным. Большое спасибо за Вашу помощь. Я хотел бы дать вам больше кредита, потому что вы фактически ответили на несколько вопросов здесь. - person Cyrill; 18.11.2020