PDF 電子署名 (Digita Signature)

PDF構文  [PDF Syntax ISO 32000-2]

PDF1.7は、ISO技術委員会によって2008年1月に“ISO 32000-1規格”として承認されました。2017年7月にはPDF2.0の規格ISO3200-2が承認され、2020年12月にはそれが第二稿に更新されました。
ここでは32000-2規格に基づいたPDF2.0の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF StructurePdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
Pdftools SDKはPDFへの電子署名と検証だけではなく、様々な変更や情報抽出などができるPDFライブラリです。

16. 電子署名(Digital Signature)機能

PDFへの電子署名は署名者に関連する検証情報を使って文書内容の整合性を検証するために使えます。
検証の際に使われる特定の認証形式は署名ハンドラという特別なソフトウェアモジュールによって実装されます。
通常は事前に定義された署名ハンドラを使用します。

PDFの電子署名は以下をサポートします。
  • 文書へのデジタル署名の追加
  • 文書に追加された署名の有効性の検証
  • 電子署名後に検証ができるようにDSS 辞書と検証関連情報(VRI)を追加
  • タイムスタンプ後に検証ができるようにドキュメント タイムスタンプ辞書(DTS)を追加
PDF2.0を処理するソフトウェアの電子署名機能はCryptographic Message Syntax(CMS;RFC5652)とCMS Advanced Electronic Signatures (CAdES;ETSI EN 319 122)をサポートしなければなりません。

16.1 電子署名の手順と署名値

署名情報は署名辞書に格納されます。
署名は適切な署名ハンドラ(追加する署名タイプと一致したもの)を使用しなければなりません。
署名ハンドラは文書のデータに対してダイジェスト値(ハッシュ値)を計算しそれを文書に保存します。

PDFファイルの電子署名値を計算する定義済みの手順は以下の二つです。
  • ByteRangeで示された範囲のダイジェスト値を計算
  • ダイジェスト値はPDF文書のByteRangeで示された範囲を元に計算されます。
    ByteRangeの範囲はPDF文書の署名値自体(Contentsエントリ)を除いた範囲で、 PDF文書の先頭にある「%PDF-」コメントから「%%EOF」コメントの末尾までのバイトシーケンスです。
    複数のデジタル署名がある場合は「%%EOF」コメントの後にEOLマーカーと共にデジタル署名辞書を追加するIncremantal Update(増分更新)が続きます。
  • 署名参照辞書による変更検出を検出
  • 変更検出は署名参照辞書によって指定します。
    TransformMethodエントリは変更検出の一般的な方法を指定し、TransformParamsエントリはメソッドの変数部分を指定します。

PDF文書には次の標準的なタイプの署名を含めることができます。
  • 使用権署名(Usage Rights Signature; PDF2.0では非推奨)
  • 使用権署は最大1つで、他の種類の署名が既に存在しない場合にのみ適用できます。
  • 証明署名(作成者署名ともいう)
  • 証明署名は最大1つです。
    証明署名の署名辞書は署名フィールドの値で、ByteRangeエントリを含みます。
  • 承認署名(受信者署名ともいう)
  • 承認署名は1つ以上含められます。
    証明書署名が存在する場合は、証明書署名の後に続けます。承認署名の署名辞書は署名フィールドの値でByteRangeエントリを含みます。
  • タイムスタンプ(Timestamp)署名
  • 任意の数の文書タイムスタンプ署名を含められます。
    文書タイムスタンプ署名の署名辞書は署名フィールドの値でありByteRangeエントリを含みます。
電子署名・タイムスタンプおよび署名検証機能を持ったライブラリ
Pdftools SDK (電子署名機能)

16.2 電子署名辞書(Signature Dictionary)

以下の署名辞書は上記すべてのタイプの署名で使用されます。
Signatureディクショナリ
キータイプ
Typename(Sigではオプション、DocTimeStampでは必須)辞書が存在する場合で署名辞書の場合は"Sig"、タイムスタンプ署名辞書の場合は"DocTimeStamp"です。
規定値:"Sig"
Filtername(必須)この署名を検証する際に使用する優先署名ハンドラーの名前
Prop_Buildエントリが存在しない場合は、署名の作成に使用された署名ハンドラーの名前含めます。Prop_Buildエントリが存在する場合は署名を作成したハンドラーの名前を特定するために使用できます。
PDFプロセッサは指定されたSubFilter形式をサポートしている限り、署名の検証時に別のハンドラーを代用することができます。 署名ハンドラーの例としては、Adobe.PPKLite、Entrust.PPKEF、CICI.SignIt、VeriSign.PPKVSなどがあります。
SubFiltername(オプション)署名辞書内の署名値と鍵情報のエンコードを表す名前
PDFプロセッサはこの形式をサポートする任意のハンドラを使用して署名を検証できます。
公開鍵暗号署名では次の値を使用する必要があります:
adbe.x509.rsa_sha1、adbe.pkcs7.detached、adbe.pkcs7.sha1、ETSI.CAdES.detached、およびETSI.RFC3161
[PDF2.0]TypeDocTimeStampの場合は"ETSI.RFC3161"でなけばならず、TypeSigの場合は"ETSI.RFC3161"以外の値を指定します。
Contentsbyte string(必須)署名値
ByteRangeが存在する場合は、それば示す範囲のダイジェストの値(16進文字列)でなければなりません。
公開鍵署名の場合のContentsは以下のいずれかでなければなりません。
  • ・DERでエンコードされたPKCS#1バイナリ・データ・オブジェクト
  • ・DERでエンコードされたCMSバイナリ/データ/オブジェクト
  • ・DERでエンコードされたCMS SignedData バイナリ・データ・オブジェクト
タイムスタンプ署名の場合のContentsはRFC3161で規定され、RFC5816で更新されたTimeStampTokenです。 TimeStampToken内のmessageImprintフィールドの値はByteRangeで示される範囲のハッシュ値を指定します。
Certbyte string/array(SubFilteradbe.x509.rsa_sha1の場合必須)公開鍵暗号を用いた署名および検証に使用されるX.509証明書チェーンを表すバイト文字列
SubFilteradbe.pkcs7.detachedまたはadbe.pkcs7.sha1の場合にこのエントリは使用されず、証明書チェーンはContentsのCMS エンベロープに格納されます。
SubFilterETSI.CAdES.detachedまたはETSI.RFC3161の場合にこのエントリは使用されず、証明書チェーンはContentsのDERエンコードされたCMS SignedDataオブジェクトに格納されます。
ByteRangearray(署名フィールドの一部であるすべての署名および権限辞書のUR3エントリから参照される使用権署名の場合必須)ダイジェスト計算のためのバイト範囲を記述する整数ペア(開始バイトオフセット、バイト長)の配列
SubFilterETSI.CAdES.detachedまたはETSI.RFC3161の場合でのByteRangeは署名辞書を含みContents値は含まないPDFファイル全体をカバーしなければなりません。
Referencearray(オプション)署名参照辞書の配列
SubFilterETSI.RFC3161の場合にはこのエントリは使用されません。
Changesarray(オプション)前回の署名と今回の署名の間に行われた文書の変更を示す3つの整数の配列(変更されたページ数、変更されたフィールド数、入力されたフィールド数の順で指定)
SubFilterETSI.RFC3161の場合にはこのエントリは使用されません。
Nametext string(オプション)文書に署名する個人または機関の名前
この値は署名から名前を抽出できない場合にのみ使用します。
SubFilterETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されなければなりません。
Mdate(オプション)署名ハンドラに応じた未検証のコンピュータ時刻、または安全なタイムサーバから検証可能な方法で生成された時刻
この値は署名内に署名時刻が存在しない場合にのみ使用します。
SubFilterETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。
Locationtext string(オプション)署名のCPUホスト名または物理的な場所
SubFilterETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。
Reasontext string(オプション)署名の理由
SubFilterETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。
ContactInfotext string(オプション)署名者が提供する情報
SubFilterETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。
Rinteger(PDF2.0では非推奨)署名の作成に使用された署名ハンドラーのバージョン
PDF1.5以降ではこのエントリは使用されずProp_Build辞書に保存されます。
Vinteger(オプション)署名辞書形式のバージョン
SubFilter値のコンテキストにおける署名辞書の使用法に対応します。署名の検証においてReference辞書が重要とみなされる場合の値は1です。 SubFilterETSI.RFC3161の場合は0です
既定値:0
Prop_Builddictionary(オプション)署名ハンドラーが署名の作成に使用されたハンドラーの名前、ソフトウェアのビルド日、バージョン、オペレーティングシステムなど、署名に使用されたコンピュータ環境の状態をキャプチャする情報を記録するために使用できる辞書
Prop_AuthTimeinteger(オプション)署名者が最後に認証されてからの秒数
署名否認の申し立てに使用されます。値が不明な場合は省略します。
SubFilterETSI.RFC3161の場合にはこのエントリは使用されません。
Prop_AuthTypename(オプション)署名者の認証に使用する方法
署名否認のクレームで使用されます。有効な値はPIN、パスワード、および指紋です。
SubFilterETSI.RFC3161の場合にはこのエントリは使用されません。

オブジェクトのタイプは「2.5オブジェクト」を参照してください。

Signature referenceディクショナリ
キータイプ
Typename(オプション)この辞書が記述する PDF オブジェクトのタイプ
TransformMethodname(必須)署名の検証時に行われる変更分析を導く変換メソッドの名前
有効な値は次のとおり:
  • DocMDP
    文書の作成者によって署名された署名フィールドに関連する文書の変更を検出するために使用されます。
  • UR
    (Pdf2.0では非推奨)権限付き文書の署名を無効にするような文書の変更を検出するために使用されます。
  • FieldMDP
    TransformParamsで指定されたフォームフィールドのリストの変更を検出するために使用されます。
TransformParamsdictionary(オプション)TransformMethodで指定された変換メソッドの変換パラメータ(変数データ)を指定する辞書
Data(TransformMethodFieldMDPの場合必須)オブジェクト変更分析を実行するドキュメント内のオブジェクトへの間接参照
DigestMethodname(PDF1.5~1.7オプション、PDF2.0必須)証明書に指定されていない場合に、ダイジェストを計算のアルゴリズムを識別する名前
有効な値は、MD5、SHA1、SHA256、SHA384、SHA512、RIPEMD160 です。
注意:MD5およびSHA1の使用はPDF2.0では非推奨です。
PDF1.5~1.7の既定値:MD5

オブジェクトのタイプは「2.5オブジェクト」を参照してください。

16.3 サンプルPDF


ご質問 ・ お問い合わせ

 メールで support@TrustSS.co.jp 宛てに、または 質問のページからお送りいただくようお願いします。
ご要望も受け付けております。


PDF Toolsライト・ライブラリ

PDF 構文解説

 

Pdftools SDK製品