Я оцениваю возможности 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 отличаются, потому что:
Adobe линеаризует файл перед запуском (изменяя также версию PDF)
Атрибуты со знаком PKCS7 (signatureAttrs), включенные в каждый случай, различны (и они включены в расчет)
В реальном сценарии PDF-файлы нуждаются в дополнительных объектах для включения подписи, которые в данном случае отсутствуют, для упрощения.
Подписание PDF-файла не только для генерации подписи, но и для встраивания ее в файл. Но теперь я сосредоточен на формате подписи (2)
После того, как возможности smime исключены:
openssl cms -nosmimecap -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal_nosmimecap.pkcs7
Различия более очевидны:
Остальные отличия:
Adobe не включает подписывание времени (1.2.840.113549.1.9.5)
В 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