前回に引き続き今回はPAdES(PDF長期署名)の解説の第二回目として「PDF署名の拡張であるPAdESを説明する前に、そもそもPDF署名とは」という事について説明してみたいと思います。

以降深堀していくPAdESについて理解できる程度に、なるべく簡単に(できればわかりやすく(^^;)説明していこうと思います。PDF署名については素人なので素人目線になると思いますが、間違いなどあったらコメントでご指摘いただければと思います。

Adobe Acrobat 9を使った署名の生成



PDFファイルの生成に最もよく使われているAdobe Acrobatを使えば、PDFファイルに電子署名をつけることができます。下の画面はAdobe Acrobat 9 Standardで署名される前のPDFファイルを開いてみた例です。ツールバーに署名のボタンがあるのがわかります。
pdfsig01

この署名ボタンを押せば、自分用の証明書と鍵を使って電子署名をつけることができます。

PDFにつけられる署名には見た目で区別して以下の2つの種類の署名があります:
・可視署名:署名したというしるしが文書中に入れられ印刷される署名
・不可視署名:署名したというしるしが印刷上表示されない署名

不可視署名されたPDFファイルをAcrobat Reader 9で開いてみると、こんな感じ。ページの中には署名が付いていることの印はなくドキュメントの上に署名が正しければ水色のツールバーが表示されます。
pdfsig03


可視署名の例はこんな感じ。ドキュメント上の水色のツールバーに加えて右側に署名したという印がついています。
pdfsig02


署名されたPDFファイルが書き換えられていた場合、水色のバーの左側に赤いバツ印がつくので、「あぁ、これは改ざんされているな」とひと目でわかるようになっています。
pdfsig04


PDFファイルの中身



PDFは実は中身はほとんどテキストファイルになっていて、ワードパットなどで見る事ができます。
pdfsig05


PDF署名の仕組み


PDF署名をざっくりと簡単に説明している図が下です。テキストで構成されているPDFのデータの途中に署名を差し込み、これによりPDFの内容を署名で保護します。
pdfsig06


PDFではページなどドキュメントオブジェクトとして扱いますが、署名もまた署名オブジェクトとして扱います。概ね以下のような形式のデータとなっており、署名に関する補足的な情報も含まれています。
18 0 obj <<
 /Type/Sig
 /Filter/Adobe.PPKLite
 /SubFilter/adobe.pkcs7.detached
 /Contents <署名値>
 /ByteRange [署名対象範囲(前開始 前長さ 後開始 後長さ)]
 /ContactInfo(電話連絡先)
 /Location(署名地)
 /M(署名日)
 /Name(署名者名)
 /Reason(署名理由)
 >>
 endobj

/Contentsの署名値の部分はPKCS#1署名(生の公開暗号による署名データ)もしくはS/MIMEメールなどで使われているPKCS#7署名またはCMSと呼ばれるASN.1バイナリ形式の署名データを16進数表現で格納します。

PDFの署名対象範囲(ByteRange)とPKCS#7署名値(Contents)の関係


署名ディクショナリの"/Contents"の値にPKCS#1かPKCS#7の署名フォーマットで署名が格納されているわけですが、どの部分を署名対象としているかを表しているのが"/ByteRange"のプロパティです。

PKCS#7の分離署名(detached署名)をContentsに入れるとして、PKCS#7署名データがどのように設定されるかを図で説明しましょう。
pdgsig_a01

(1)ページデータの最後あたりに署名オブジェクト(/Type/Sig)を入れるとして
(2)事前にPKCS#7署名データのサイズより大きめに領域を確保しておき
(3)ByteRangeを計算し
(4)ByteRangeで指定された2つの範囲を署名対象としてPKCS#7署名を生成
(5)生成されたPKCS#7署名を16進数表現にして/Contentsに設定
という流れになります。

入れられるPKCS#1署名、PKCS#7署名にバリエーションありすぎ


上の図ではPKCS#7を想定して書きましたが、PKCS#1であっても同じようなものです。中に署名を格納する方法に様々なバリエーションがあります。RFC3161ベースのタイムスタンプトークンを格納することもできます。

・生の属性を含まないPKCS#1署名
・署名属性、非署名属性を持たないPKCS#7署名
・署名属性、非署名属性を持つPKCS#7署名orCMS
・署名属性、非署名属性を持つタイムスタンプ付きPKCS#7署名orCMS

署名者(の証明書)の特定がしにくいものもあったりするので、欧州電子署名指令に合うように、署名者の特定をなるべく厳密にできるようにPKCS#7、CMSもしくはCAdES長期署名のプロファイルを定めたのがPAdES(PDF長期署名)ということになります。

さて、今回はPDF署名の中身はPKCS#7もしくはCMS署名フォーマットで、どんなふうに埋められているのかってことが、なんとなくお分かりいただけたでしょうか。

PAdESの入り口に入って行きたいとおもいます。PDF署名で補足したほうがよさそうな事を思い出したら、また書いてみたいと思います。

ではでは、、、

う〜〜ん、ちょっと熱っぽい、、、




参考リンク


PDF署名で参考になりそうなリンクを記しておきます。
・Adobe Acrobat 9 Standard オンラインマニュアル
・アンテナハウス PDF電子署名入門(2008.08.24)
PDF 1.7の仕様は元々Adobe社が作成したものですが、これがISO 32000-1の国際標準にもなっています。Adobeのサイトでダウンロードできますので、仕様の詳しい部分を知りたい場合にはこちらもご覧ください。