Tôi đang đánh giá khả năng của openssl để tạo chữ ký PDF . Tôi thấy một số khác biệt giữa các trường chữ ký PKCS7 được tạo bởi openssl và các chương trình khác.
Làm cách nào tôi có thể chỉ định chính xác các trường SignAttr sẽ được bao gồm trong chữ ký?
Ví dụ, đây là so sánh ba chiều thông qua meld :
$ 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)
Phía bên trái : minim_sign_pdfbox.pkcs7 được tạo bởi pdfbox (nó sử dụng Bouncy Castle ) theo cách này:
java -jar pdfbox-sign.jar JohnSmith.pem <PASSWORD> minimal.pdf
- trích xuất PKCS7 thành Minimal_sign_pdfbox.pkcs7
Center : PKCS7 được tạo bởi Adobe Reader DC (nó sử dụng Adobe PubSec ) theo cách này:
Tạo ID kỹ thuật số từ tệp JohnSmith.pfx
Ký tài liệu với ID kỹ thuật số đó
Lưu kết quả như trong Minimal_sign_adobe.pdf
trích xuất PKCS7 thành Minimal_sign_adobe.pkcs7
Phải : PKCS7 được tạo bởi OpenSSL này thông qua dòng lệnh :
openssl cms -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal.pkcs7
Trong hai trường hợp đầu tiên, pkcs7 đã được trích xuất từ pdf bằng công cụ peepdf .
Tệp Minimal.pdf đang được ký là tệp được mô tả trong tiêu chuẩn ISO-32000 trong Phụ lục H.2: Tệp PDF tối thiểu .
Phần còn lại của các tệp được sử dụng và chứng chỉ được nén ở đây: so.zip .
Các trường chữ ký và messageDigest khác nhau vì:
Adobe tuyến tính hóa tệp trước khi bắt đầu (cũng thay đổi phiên bản PDF)
Các thuộc tính PKCS7 đã ký ( SignAttrs ) được bao gồm trong mọi trường hợp là khác nhau (và chúng được bao gồm trong tính toán)
Trong kịch bản thực, PDF cần thêm các đối tượng để bao gồm chữ ký, không có trong trường hợp này, để đơn giản hóa.
Việc ký một bản PDF không chỉ để tạo chữ ký mà còn để nhúng nó vào tập tin. Nhưng bây giờ tôi tập trung vào định dạng chữ ký (2)
Khi các khả năng của khói được loại trừ:
openssl cms -nosmimecap -sign -signer JohnSmith.pem -binary -in minimal.pdf -outform der -out minimal_nosmimecap.pkcs7
Sự khác biệt rõ ràng hơn:
Sự khác biệt còn lại là:
Adobe không bao gồm SignTime (1.2.840.113549.1.9.5)
pdfbox chỉ định thuộc tính đã ký thêm 1.2.840.113549.1.9.52 không được nhận dạng bởi ( openssl asn1parse ) để chỉ định mã hóa sha256 thay vì chỉ định thuật toán / thuật toán chữ ký là sha256WithRSAEncoding ( 1.2.840.113549.1.1.11 )
Làm thế nào tôi có thể quản lý các thuộc tính đã ký? Thông qua dòng lệnh tôi chỉ có tham số liên quan này:
-noattr don't include any signed attributes
tham số -nosmimecap không xuất hiện thông qua:
openssl cms --help
Nhưng nó hoạt động , có các tham số ẩn khác để kiểm soát điều đó?
Tôi đang sử dụng:
$ openssl version
OpenSSL 1.0.2g 1 Mar 2016