出力イメージ
下記の出力は simple_sig.pdf から pCOS コマンドラインツールで CMS (Cryptographic Message Syntax) オブジェクトを取り出し、OpenSSL で処理した結果です。このうち notAfter が証明書の有効期限にあたるため、この PDF で使用されている証明書は 2024年4月29日 (グリニッジ標準時) まで有効であることがわかります。
$ pcos --binary --verbose 0 --pcospath signaturefields[0]/V/Contents simple_sig.pdf | openssl cms -inform DER -cmsout -print
CMS_ContentInfo:
contentType: pkcs7-signedData (1.2.840.113549.1.7.2)
d.signedData:
version: 1
digestAlgorithms:
algorithm: sha256 (2.16.840.1.101.3.4.2.1)
parameter: <ABSENT>
encapContentInfo:
eContentType: pkcs7-data (1.2.840.113549.1.7.1)
eContent: <ABSENT>
certificates:
d.certificate:
cert_info:
version: 2
serialNumber: 1
signature:
algorithm: sha256WithRSAEncryption (1.2.840.113549.1.1.11)
parameter: NULL
issuer: C=DE, L=Munich, O=PDFlib GmbH, CN=PDFlib GmbH Demo CA G3
validity:
notBefore: Mar 30 13:44:33 2020 GMT
notAfter: Mar 29 13:44:33 2024 GMT
subject: C=DE, L=Munich, O=PDFlib GmbH, CN=PLOP Demo Signer RSA-2048
key:
algor:
algorithm: rsaEncryption (1.2.840.113549.1.1.1)
parameter: NULL
... (以下省略)
処理手順
ここでは PLOP, PLOP DS に同梱されている pCOS コマンドラインツールを利用しています。PDF 内の証明書には pCOS の疑似オブジェクト signaturefields でアクセスすることができ、証明書の数だけ要素を持つ配列になっています。要素数は length 接頭辞で取得できます。
$ pcos --pcospath length:signaturefields simple_sig.pdf
PDFlib pCOS: PDF Information Retrieval Tool, 5.4, pCOS interface 12
(c) 2007-2020 PDFlib GmbH www.pdflib.com sales@pdflib.com
1
pCOS コマンドラインツールでは、実行時に上記のようにバージョンとコピーライトが表示されます。これらがパイプ処理の妨げになる場合、冒頭のコマンドの通り "--verbose 0" で表示を抑制できます。
signaturefields[n] では証明書名 (/Name) や署名日時 (/M) 等の情報にアクセスできますが、この中に証明書の有効期限の情報は含まれていません。証明書の情報は /V/Contents からアクセスできる CMS オブジェクト に含まれていますが、pCOS 自身はこれを解析する機能を持たないため、今回は一例として OpenSSL で解析しています。
PDF の CMS オブジェクトは ASN.1 DER 形式で符号化されているため、OpenSSL では "-inform DER" を指定する必要があります。出力のうち notBefore と notAfter の間が証明書の有効期限なので、PDF を再署名する場合は notAfter より前に行う必要があります。"openssl cms" で特定要素のみを表示することはできないため、notAfter だけを取得する場合はさらに grep にパイプする等の方法が必要になります。