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 StructureやPdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
ここでは32000-2規格に基づいたPDF2.0の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF StructureやPdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
16. 電子署名(Digital Signature)機能
PDFへの電子署名は署名者に関連する検証情報を使って文書内容の整合性を検証するために使えます。
検証の際に使われる特定の認証形式は署名ハンドラという特別なソフトウェアモジュールによって実装されます。
通常は事前に定義された署名ハンドラを使用します。
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(増分更新)が続きます。
ByteRangeの範囲はPDF文書の署名値自体(Contentsエントリ)を除いた範囲で、 PDF文書の先頭にある「%PDF-」コメントから「%%EOF」コメントの末尾までのバイトシーケンスです。
複数のデジタル署名がある場合は「%%EOF」コメントの後にEOLマーカーと共にデジタル署名辞書を追加するIncremantal Update(増分更新)が続きます。
変更検出は署名参照辞書によって指定します。
TransformMethodエントリは変更検出の一般的な方法を指定し、TransformParamsエントリはメソッドの変数部分を指定します。
TransformMethodエントリは変更検出の一般的な方法を指定し、TransformParamsエントリはメソッドの変数部分を指定します。
PDF文書には次の標準的なタイプの署名を含めることができます。
- 使用権署名(Usage Rights Signature; PDF2.0では非推奨)
- 証明署名(作成者署名ともいう)
- 承認署名(受信者署名ともいう)
- タイムスタンプ(Timestamp)署名
使用権署は最大1つで、他の種類の署名が既に存在しない場合にのみ適用できます。
証明署名は最大1つです。
証明署名の署名辞書は署名フィールドの値で、ByteRangeエントリを含みます。
証明署名の署名辞書は署名フィールドの値で、ByteRangeエントリを含みます。
承認署名は1つ以上含められます。
証明書署名が存在する場合は、証明書署名の後に続けます。承認署名の署名辞書は署名フィールドの値でByteRangeエントリを含みます。
証明書署名が存在する場合は、証明書署名の後に続けます。承認署名の署名辞書は署名フィールドの値でByteRangeエントリを含みます。
任意の数の文書タイムスタンプ署名を含められます。
文書タイムスタンプ署名の署名辞書は署名フィールドの値でありByteRangeエントリを含みます。
文書タイムスタンプ署名の署名辞書は署名フィールドの値でありByteRangeエントリを含みます。
16.2 電子署名辞書(Signature Dictionary)
以下の署名辞書は上記すべてのタイプの署名で使用されます。
| キー | タイプ | 値 |
|---|---|---|
| Type | name | (Sigではオプション、DocTimeStampでは必須)辞書が存在する場合で署名辞書の場合は"Sig"、タイムスタンプ署名辞書の場合は"DocTimeStamp"です。 規定値:"Sig" |
| Filter | name | (必須)この署名を検証する際に使用する優先署名ハンドラーの名前 Prop_Buildエントリが存在しない場合は、署名の作成に使用された署名ハンドラーの名前含めます。Prop_Buildエントリが存在する場合は署名を作成したハンドラーの名前を特定するために使用できます。 PDFプロセッサは指定されたSubFilter形式をサポートしている限り、署名の検証時に別のハンドラーを代用することができます。 署名ハンドラーの例としては、Adobe.PPKLite、Entrust.PPKEF、CICI.SignIt、VeriSign.PPKVSなどがあります。 |
| SubFilter | name | (オプション)署名辞書内の署名値と鍵情報のエンコードを表す名前 PDFプロセッサはこの形式をサポートする任意のハンドラを使用して署名を検証できます。 公開鍵暗号署名では次の値を使用する必要があります: adbe.x509.rsa_sha1、adbe.pkcs7.detached、adbe.pkcs7.sha1、ETSI.CAdES.detached、およびETSI.RFC3161
[PDF2.0]TypeがDocTimeStampの場合は"ETSI.RFC3161"でなけばならず、TypeがSigの場合は"ETSI.RFC3161"以外の値を指定します。 |
| Contents | byte string | (必須)署名値 ByteRangeが存在する場合は、それば示す範囲のダイジェストの値(16進文字列)でなければなりません。 公開鍵署名の場合のContentsは以下のいずれかでなければなりません。
|
| Cert | byte string/array | (SubFilterがadbe.x509.rsa_sha1の場合必須)公開鍵暗号を用いた署名および検証に使用されるX.509証明書チェーンを表すバイト文字列 SubFilterがadbe.pkcs7.detachedまたはadbe.pkcs7.sha1の場合にこのエントリは使用されず、証明書チェーンはContentsのCMS エンベロープに格納されます。 SubFilterがETSI.CAdES.detachedまたはETSI.RFC3161の場合にこのエントリは使用されず、証明書チェーンはContentsのDERエンコードされたCMS SignedDataオブジェクトに格納されます。 |
| ByteRange | array | (署名フィールドの一部であるすべての署名および権限辞書のUR3エントリから参照される使用権署名の場合必須)ダイジェスト計算のためのバイト範囲を記述する整数ペア(開始バイトオフセット、バイト長)の配列 SubFilterがETSI.CAdES.detachedまたはETSI.RFC3161の場合でのByteRangeは署名辞書を含みContents値は含まないPDFファイル全体をカバーしなければなりません。 |
| Reference | array | (オプション)署名参照辞書の配列 SubFilterがETSI.RFC3161の場合にはこのエントリは使用されません。 |
| Changes | array | (オプション)前回の署名と今回の署名の間に行われた文書の変更を示す3つの整数の配列(変更されたページ数、変更されたフィールド数、入力されたフィールド数の順で指定) SubFilterがETSI.RFC3161の場合にはこのエントリは使用されません。 |
| Name | text string | (オプション)文書に署名する個人または機関の名前 この値は署名から名前を抽出できない場合にのみ使用します。 SubFilterがETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されなければなりません。 |
| M | date | (オプション)署名ハンドラに応じた未検証のコンピュータ時刻、または安全なタイムサーバから検証可能な方法で生成された時刻 この値は署名内に署名時刻が存在しない場合にのみ使用します。 SubFilterがETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。 |
| Location | text string | (オプション)署名のCPUホスト名または物理的な場所 SubFilterがETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。 |
| Reason | text string | (オプション)署名の理由 SubFilterがETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。 |
| ContactInfo | text string | (オプション)署名者が提供する情報 SubFilterがETSI.RFC3161の場合にはこのエントリは使用せず、PDFプロセッサによって無視されます。 |
| R | integer | (PDF2.0では非推奨)署名の作成に使用された署名ハンドラーのバージョン PDF1.5以降ではこのエントリは使用されずProp_Build辞書に保存されます。 |
| V | integer | (オプション)署名辞書形式のバージョン SubFilter値のコンテキストにおける署名辞書の使用法に対応します。署名の検証においてReference辞書が重要とみなされる場合の値は1です。 SubFilterがETSI.RFC3161の場合は0です 既定値:0 |
| Prop_Build | dictionary | (オプション)署名ハンドラーが署名の作成に使用されたハンドラーの名前、ソフトウェアのビルド日、バージョン、オペレーティングシステムなど、署名に使用されたコンピュータ環境の状態をキャプチャする情報を記録するために使用できる辞書 |
| Prop_AuthTime | integer | (オプション)署名者が最後に認証されてからの秒数 署名否認の申し立てに使用されます。値が不明な場合は省略します。 SubFilterがETSI.RFC3161の場合にはこのエントリは使用されません。 |
| Prop_AuthType | name | (オプション)署名者の認証に使用する方法 署名否認のクレームで使用されます。有効な値はPIN、パスワード、および指紋です。 SubFilterがETSI.RFC3161の場合にはこのエントリは使用されません。 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
| キー | タイプ | 値 |
|---|---|---|
| Type | name | (オプション)この辞書が記述する PDF オブジェクトのタイプ |
| TransformMethod | name | (必須)署名の検証時に行われる変更分析を導く変換メソッドの名前 有効な値は次のとおり:
|
| TransformParams | dictionary | (オプション)TransformMethodで指定された変換メソッドの変換パラメータ(変数データ)を指定する辞書 |
| Data | (TransformMethodがFieldMDPの場合必須)オブジェクト変更分析を実行するドキュメント内のオブジェクトへの間接参照 | |
| DigestMethod | name | (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
- 署名されたPDFのサンプル
- 署名後に変更されたPDFのサンプル
電子署名やタイムスタンプされたPDF文書
- LTV対応ですので、署名時点での電子署名を検証できるPDF文書です。
- LTV対応ですので、署名時点での電子署名を検証できるPDF文書です。
PDFとしては問題ありませんが、署名後の変更ですので「改ざんされた文書」と判断されるべきものです。