2

Я оцениваю возможности openssl для создания подписей PDF. Я вижу некоторые различия между полями сигнатур PKCS7, сгенерированными openssl и другими программами.

Как я могу точно указать, какие поля SignAttr будут включены в подпись?

Например, вот трехстороннее сравнение с помощью комбинации:

$ meld <(openssl cms -inform DER -cmsout -print -in minimal_signed_pdfbox.pkcs7) \
       <(openssl cms -inform DER -cmsout -print -in minimal_signed_adobe.pkcs7)  \
       <(openssl cms -inform DER -cmsout -print -in minimal.pkcs7)

Левая сторона: minimal_signed_pdfbox.pkcs7, сгенерированный pdfbox (он использует Bouncy Castle) следующим образом:

java -jar pdfbox-sign.jar JohnSmith.pem <PASSWORD> minimal.pdf
  • распаковать PKCS7 в minimal_signed_pdfbox.pkcs7

Центр: PKCS7, сгенерированный Adobe Reader DC (он использует Adobe PubSec) следующим образом:

  • Создайте цифровой идентификатор из файла JohnSmith.pfx

  • Подпишите документ с этим цифровым удостоверением

  • Сохраните результат как в minimal_signed_adobe.pdf

  • извлечь PKCS7 в minimal_signed_adobe.pkcs7

Справа: PKCS7, сгенерированный OpenSSL через командную строку:

openssl cms -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal.pkcs7

В первых двух случаях pkcs7 был извлечен из pdf с помощью инструмента peepdf .

Подписываемый файл minimal.pdf описан в стандарте ISO-32000 в Приложении H.2: Минимальный файл PDF.

Остальные используемые файлы и сертификаты находятся здесь: so.zip.

Поля signature и messageDigest отличаются, потому что:

  1. Adobe линеаризует файл перед запуском (изменяя также версию PDF)

  2. Атрибуты со знаком PKCS7 (signatureAttrs), включенные в каждый случай, различны (и они включены в расчет)

  3. В реальном сценарии PDF-файлы нуждаются в дополнительных объектах для включения подписи, которые в данном случае отсутствуют, для упрощения.

Подписание PDF-файла не только для генерации подписи, но и для встраивания ее в файл. Но теперь я сосредоточен на формате подписи (2)

После того, как возможности smime исключены:

openssl cms -nosmimecap -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal_nosmimecap.pkcs7

Различия более очевидны:

Остальные отличия:

  1. Adobe не включает подписывание времени (1.2.840.113549.1.9.5)

  2. В pdfbox укажите дополнительный подписанный атрибут 1.2.840.113549.1.9.52, который не распознается (openssl asn1parse), чтобы указать шифрование sha256 вместо указания алгоритма / алгоритма signature как sha256WithRSAEncryption (1.2.840.113549.1.1.11)

Как я могу управлять этими подписанными атрибутами? Через командную строку у меня есть только этот связанный параметр:

-noattr        don't include any signed attributes

параметр -nosmimecap не появляется через:

openssl cms --help

но это работает, есть ли другие скрытые параметры для управления этим?

Я использую:

$ openssl version
OpenSSL 1.0.2g  1 Mar 2016

0