1JNSA 電子署名WG スキルアップTF
なんとなく分かった気になるPDF電子署名仕様入門2

宮地直人（miyachi@langedge.jp）

２０１３年１０月３０日

2013/10/30

2

PDF電子署名仕様入門○ PDF基本
PDFの内部構造と基本要素増分更新○ PDF電子署名基本
PDFの署名要素○ PAdES（PDF長期署名）基本PAdESの構造
LTV構造の構成

2013/10/30

3

PDF基本１：PDFをテキストエディタで見てみよう%PDF-1.3%%%%%
6 0 obj76
endobj
4 0 obj<</Length 6 0 R>>
stream
0 0 0 rg
BT/F0 11.00 Tf
85.0 730.0 Td[ (ABC) ] TJ
ETqQ
endstream
endobj
3 0 obj<</BleedBox[0 0 595.320010 841.919980]/Contents[4 0 R]
/CropBox[0 0 595.320010 841.919980]/MediaBox[0 0 595.320010 841.919980]/Parent 2 0 R/Resources<</Font<</F0 5 0 R>>/ProcSet[/Text/ImageC]>>/Type/Page>>endobj2 0 obj<</Count 1/Kids[3 0 R]
/Parent 1 0 R/Type/Pages>>
endobj
1 0 obj<</BleedBox[0 0 595.320010841.919980]/Count 1/CropBox[0 0 595.320010 841.919980]/Kids[2 0 R]
/MediaBox[0 0 595.320010 841.919980]/Type/Pages>>
endobj
7 0 obj<</Ascent 985/AvgWidth 464/CapHeight 985/Descent -215/Flags 42/FontBBox[-165 -307 1246 1201]/FontName/Century/ItalicAngle 0/MaxWidth 1410
/StemV 0/Type/FontDescriptor>>
endobj
5 0 obj<</BaseFont/Century/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 7 0 R/LastChar 67/Name/F0/Subtype/TrueType/Type/Font/Widths[278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 722722]>>
endobj
9 0 obj[3 0 R/XYZ 0 841.919980 null]

endobj
8 0 obj<</OpenAction 9 0 R/Pages 1 0 R/Type/Catalog>>
endobj
10 0 obj<</CreationDate(D:20110610150233+09'00')/ModDate(D:20110610150233+09'00')/Producer(Test ¥(1.0¥))/Trapped/False>>
endobjxref
0 110000000000 65535 f
0000000444 00000 n
0000000380 00000 n
0000000160 00000 n0000000034 00000 n
0000000785 00000 n
0000000016 00000 n
0000000602 00000 n
0000001061 00000 n
0000001016 00000 n
0000001123 00000 n
trailer<</ID[<BF61BD682C7E7D44F2DF1EAB84335E2B><BF61BD682C7E7D44F2DF1EAB84335E2B>]/Info 10 0 R/Root 8 0 R/Size 11>>startxref
1283
%%EOF

2013/10/30

4PDF基本２：主なオブジェクト例
１．数値オブジェクト
6 0 obj76
endobjオブジェクト開始（オブジェクト番号が6 、生成番号が0）整数型で値が76
オブジェクト終了

２．辞書オブジェクト（キーと値で情報を記述するオブジェクト）
2 0 obj
辞書型開始<<
キーが”/Type”の名前型で、値が”/Pages”/Type /Pages
キーが”/Kids”の配列型で、配列中の値が間接指定型で”3 0 R”
/Kids [ 3 0 R]
キーが”/Count”の整数型で、値が1/Count 1
キーが”Parent”の間接指定型で、値が”1 0 R”
/Parent 1 0 R
辞書型終了>>
endobj

ポイント：オブジェクト番号と生成番号
オブジェクト番号は重複しないオブジェクト識別用IDです。
生成番号は本来オブジェクトを再利用した時に更新される番号ですが現在では事実上利用されておらず常にゼロ0と考えて貰って構いません。

2013/10/30

5PDF基本３：主なオブジェクト例２
３．ストリームオブジェクト（任意データを埋め込むオブジェクト）
4 0 obj<</Length 6 0 R>>
stream
0 0 0 rg
BT/F0 11.00 Tf
85.0 730.0 Td[ (ABC) ] TJ
ETq Q
endstream
endobj

長さはオブジェクト番号6で定義
ストリーム開始
テキスト開始フォント名/F0とサイズ11.00の指定
座標 85.0, 730.0 に移動
テキスト”ABC”の描画
テキスト終了描画用オペレータ

ストリーム終了※ フィルター指定ストリームオブジェクト
4 0 obj
長さはオブジェクト番号6で定義<</Length 6 0 R/Filter /FlateDecode>>
FlateDecodeによりZIP圧縮を実行
Stream※ バイナリ値（ZIP圧縮されたデータ）
endstream
endobj2013/10/30

6PDF基本４：オブジェクトの種類
 オブジェクト形式
 オブジェクト番号と生成番号とobj/endobj： 1 0 obj value endobj

 オブジェクト（Objects / Value）
 ブーリアン（Boolean values） ： true, false 数値（Integer and Real numbers）： 10, -3, 3.4, -0.32, +10.0
 文字列（Strings） ※暗号化対象
 定数文字列（Literal Strings）： (Ver ¥(1.0¥)) ※エスケープ文字”¥”あり 16進文字列（Hexadecimal Strings）： <4E6A> ※バイナリにも使われる 名前（Names）： /Name, /Color#20Green, /A#42
 配列（Arrays）： [ value1 value2 value3 ] 辞書（Dictionaries）： << /Key1 value1 /Key2 value2 /Key3 value3 >> ストリーム（Streams）： <<Dictionary>>stream … endstream ※暗号化対象
 /Filter： /FlateDecode (ZIP), /DCTDecode (JPEG), /ASCIIHexDecode, …

 null 間接指定（Indirect）： 23 0 R （23 0 obj を示す）

2013/10/30

7PDF基本５：PDFファイル構造１（レガシー）形式
0Header

4550
4682
Body

32034

%PDF-1.7%バイナリ値
1 0 obj … endobj
2 0 obj<< /Type /Catalog/Pages 8 0 R /Info 9 0 R >>endobj:
10 0 obj … endobj

Header
PDFの開始とバージョン。
バイナリなら任意バイナリ値。
Body
PDF本体でありオブジェクトが並んでいる。オブジェク
ト位置はXRef テーブルから取得。ルートからページ等のツリーを辿れる。

XRefxref
0 30
0000000000 65535 f0000004550 00000 n0000004682 00000 n:

Cross-Reference Table
最初の10桁が開始位置を次の5桁が生成番号だがだいたい0になる。
バイナリ形式のXRef もあり混在は不可。

Trailer

trailer << /Size 30 /Root 2 0 R/ID <….><….> >>startxref 32034%%EOF

Trailerstartxref がXRefの開始位置を、trailer辞書でルート等の指定。

2013/10/30

8PDF基本６：PDFファイル構造２（Cross-Reference Streams & object stream）
0Header

テキストエディタで解析が困難。
Acrobat Pro推奨。

Body

20323

%PDF-1.7%バイナリ値
1 0 obj<< /Type /ObjStm /N 3 /First 15 >>stream2 0 3 50 5 72 …
[ OID1 offset1 OID2 offset2 … ]<< … >><< /Type /Catalog /Pages 8 0 R /Info 9 0 R >>:ObjStm
endstream endobj
複数のオブジェクトをストリーム:にまとめ圧縮。
10 0 obj … endobj
12 0 obj<< /Type /Xref /Size 30 /Root 3 0 R >>stream
バイナリ形式でXRef情報を記述
endstream endobj

Trailerstartxref 20323%%EOF

2013/10/30

9PDF基本７：Acrobat ProでPDF内部構造を見る
Acrobat Pro版のみの機能でStd版では使えないので注意！

2013/10/30

10PDF基本８：増分更新（Incremental Update）
Header%PDF-1.7

Body

1 0 obj … endobj
2 0 obj/Price /2000
endobj:
10 0 obj … endobj

XRefTrailer

:
%%EOF

元ファイル

Body2

増分更新
増分更新では情報を上書きする。
電子署名では増分更新可能な内容が制限されている。

XRef2
Trailer2

通常更新%PDF-1.7%PDF-1.7

1 0 obj … endobj
2200 obj
obj
使われない/Price/2000/Price /1200
endobj＝endobj:
10 0 obj … endobj

1 0 obj … endobj
2 0 obj/Price /1200
endobj:
10 0 obj … endobj

:
%%EOF

:%%EOF

2 0 obj/Price /1200
endobj:trailer << …
/Prev 48930>>:%%EOF

上書き

PAdESでは増分更新で情報を追加してゆく。

2013/10/30

11PDF基本９：PDFに関する資料
・PDF Reference 2nd edition （PDF1.3）を和訳化した書籍
古い版だが基本的な構造を日本語で読める。
PDFファイル構造はレガシー形式のみ
とりあえずPDFを勉強するなら持っていて損は無い。
定価は税別6800円だが中古市場では7,000～14,000円くらい。
定価で売っているお店があれば確保推奨。
ISBN-10: 4894713381 / ISBN-13: 978-4894713383
・PDF Reference の原本はアドビが無償配布
最終はPDF1.7だがISOとの比較資料等もあります。
他にもアドビから署名外観等の有用情報が多数あり。
ISO版は有償なのでPAdES以外ならアドビ版で十分。
http://www.adobe.com/jp/devnet/pdf/pdf_reference.html
・最後にISO32000
ISO32000-1はISOから購入が可能、ISO32000-2が待たれる。
238スイスフラン（約26,000円）
http://www.iso.org/iso/catalogue_detail.htm?csnumber=51502

2013/10/30

12

PDF署名基本１：オブジェクト要素
 署名フィールド/署名注釈（SigField/SigAnnotation）• 本来署名フィールドと署名注釈は別の辞書構造だが１つの辞書として指定可能。最近では別々にするような実装は少ないが注意。
• ページ番号と矩形を指定。矩形がサイズゼロなら不可視署名になる。
• Root→AcroForm→Fields or Root→Pages→Page→Annots で辿れる。
• 署名辞書を /V キーで指定。未指定なら未署名の署名フィールドとなる。
• 署名外観を /AP キーで指定。不可視署名ならブランクを指定。

 署名辞書（SigDict） ※電子署名として最も重要な要素• /Type は /Sig か /DocTimeStamp を指定。
• 署名データを /Contents キーで16進文字列として保持。
• /ByteRange や /Filter /SubFilter 等の情報を保持。

暗号化対象のはず（仕様に記述無し）
だが実際には、暗号化しては駄目 署名外観（SigAppearance）• XObject のリソースとして外観情報を指定。実は ISO 等の標準ではない。
• デファクトは「Adobe Acrobat 9 Digital Signature Appearances」である。
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/acrobat_digital_signature_appearances_v9.pdf

2013/10/30

13

PDF署名基本２：内部構造例

署名フィールド（署名注釈）
署名辞書

署名外観

2013/10/30

14

PDF署名基本３：オブジェクトの組み合わせ
未署名

署名済み

署名フィールド

署名フィールド/Rect [0 0 0 0]

/Rect [0 0 0 0]

不可視署名
署名外観

署名外観

/Type /Xobject%DSBlank/Type /Xobject%DSBlank

署名フィールド

署名フィールド/Rect [x1 y1 x2 y2]/Rect [x1 y1 x2 y2]

署名外観

可視署名/Type /Xobject%DSBlank
実際にはもっと複雑な構造となるがここでは簡略化して示している

署名辞書/ByteRange [a b c d]/Contents <3082…>

署名辞書
署名外観/Type /Xobject/Resources /n0 /n2

署名外観 /n0/Type /Xobject%DSBlank/ByteRange [a b c d]/Contents <3082…>

実際の署名外観

署名外観 /n2/Type /Xobject
q IMG TEXT … Q

2013/10/30

15

PDF署名基本４：ByteRangeと署名対象
署名辞書 ： /ByteRange [ 開始位置１ 長さ１ 開始位置２ 長さ２ ]配列

2013/10/30

PDF署名基本５：シリアル署名（複数署名）

16

2013/10/30

17

PAdES基本１：PAdESの構成
Part
Title
Part1: PAdES Overview
Part2:
Part3:
Part4:

Part5:
Part6:

AboutPAdES全体の概要を解説している。最初に読むべき解説。
既存のPDF仕様（ISO 32000-1/PDF1.7）に基づく署名プロファ
PAdES Basic
イル。署名プロファイルとしてPKCS#7(CMS)を利用。
署名プロファイルとしてCAdES-BES/CAdES-EPES/CAdES-T
PAdES Enhancedを使った署名プロファイル。
PAdES-LTV（Long Term Validation）Profile
PAdES Long Term
長期署名の為に新たに加えられたDSS/VRI辞書を使って検証(LTV)
情報とドキュメントタイムスタンプをPDFに埋め込む。
PDF に 添 付 さ れ た XML ド キ ュ メ ン ト や 、 XFA （ XML Forms
PAdES
Architecture ） と し て 埋 め 込 ま れ た XML フ ォ ー ム に 対 し て 、for XML Content
XAdESを使った長期署名プロファイル
Visual Representations 署名外観や検証に関する仕様
of Electronic Signatures ただし簡易説明であり詳細は別仕様を参照※ 署名辞書の違い
形式/Type/SubFiler

PAdES-Basic/Sig

PAdES-Enhanced
DocTimeStamp(PAdES-LTV)/Sig/adbe.pkcs7.detached/adbe.pkcs7.sha1/ETSI.CAdES.detached/DocTimeStamp/ETSI.RFC3161

署名部/Contents

その他

PKCS7
(+TST)

ISO32000-1の署名
ほぼそのままCAdES

CAdES-T/BES/EPES

TST

Name, M, Location,Reason等は非推奨

2013/10/30

18

PAdES基本２：PAdESの構成
署名タイムスタンプは埋め込み以外に別途
DocTimeStampでも可%PDF-1.7

元ファイル
PDF

署名データ

/Type/Sig/Contents<3082160006092a8a:0000000000000000
00000> /ByteRange […]署名タイムスタンプ付可能証明書やCRL等も埋め込み可能
PKCS#7 か CAdES 形式

署名付PDF＋署名タイムスタンプ

増分更新

%%EOF
DSS
証明書群
CRL群
VRI%%EOFLong Term Validation

LTV(検証情報)/Type/DocTimeStamp

増分更新/Contents<30820f7306092a86:0000000000000000
0000000> /ByteRange […]%%EOF

署名データに検証情報を含めるならDSS/VRIは無くても良いドキュメントタイムスタンプ
タイムスタンプトークン

乱暴に言えば…
署名＋LTV＋タイムスタンプ＝PAdES（長期保管用PDF）

2013/10/30

19

PAdES基本３： PAdESのレベル遷移
ES（署名基本）

ES-T（署名タイムスタンプ）

検証情報の埋め込み

長期保管状態

Baseline Profile B-Level

T-LevelLT-Level

LTA-Level

%PDF

%PDF

%PDF

ES1%%EOF

%PDF

ES1

ES1

ES1

DocTS1

DocTS1DocTS1

LTV (DSS/VRI)LTV (DSS/VRI)

Certs,CRLs,OCSPs

Certs,CRLs,OCSPs

%%EOF
%PDF

ES1SigTS%%EOF

DocTS2%%EOF%%EOF

CT (Content-TimeStamp)%PDF

DocTS1%PDF%PDF

DocTS1%%EOF

DocTS1

LTV (DSS/VRI)LTV (DSS/VRI)

Certs,CRLs,OCSPs

Certs,CRLs,OCSPs

DocTS2%%EOF%%EOF

2013/10/30

20

PAdES基本４： 検証情報
検証情報の種類 説明
署名書群

署名証明書（タイムスタンプ証明書を含む）から信頼されたルート証明書（トラストアンカー）までの証明書チェーン（認証パス）を構築する為に必要な全証明書が必要。

失効情報群

失効情報には、CRL（証明書失効リスト）とOCSP（オンライン失効情報問合せ）の2種類がある。CRLは失効している証明書の情報であり、OCSPは指定された証明書の失効を含む各種状態を返す。失効情報としてCRLとOCSPのどちらを使っても良い。

優先順位 検証情報の格納場所
1

DSS の中の署名VRI 要素から参照されている検証情報

2

DSS から参照されている検証情報3

署名データ自身に埋め込まれている検証情報

4

ローカルなリポジトリに保管されている検証情報（外部から提供）

5

オンラインソースから取得された検証情報（ネットワークから取得）

2013/10/30

21

PAdES基本５：PAdES-LTVの内部構造例

DSS辞書

VRI辞書

署名辞書群

2013/10/30

22

PAdES基本６：PAdES-LTVの内部構造例２

DSS辞書

CRL群

証明書群
VRI 辞書Acrobat-XIでは、DSSのCRLと証明書は重複して全てが保管されるようだ

VRIは署名データのハッシュ値で関連付ける
これはドキュメントタイムスタンプのハッシュ値
注：ドキュメントタイムスタンプはタイムスタンプトークン（0を含まない）のハッシュ値を計算する

VRIは署名データのハッシュ値で関連付けるこれは最初に付与した署名データのハッシュ値
注：署名データは/Contentsに指定されたバイナリ（0を含む）のハッシュ値を計算する
謎：TUだけのVRI情報があるのだが何だろう？

2013/10/30

23

PAdES基本７：PAdES（PDF長期署名）に関する資料
1. ETSI仕様書
以下ダウンロードサイトから”TS 102 778”で検索してダウンロード
http://pda.etsi.org/pda/queryform.asp

2. ECOM 電子署名普及に関する活動報告2009
3.1 PAdESの概要、経緯、動向
http://www.jipdec.or.jp/archives/ecom/results/h21seika/H21results-09.pdf

3. PDFインフラストラクチャー解説（現在更新中）
22.7 PDF長期署名（PAdES） 他にもPDF署名等の説明もあり
http://www.cas-ub.com/project/index.html#Free

4. Acrobat-XIでPAdESファイルを作成する
http://www.langedge.jp/download/20130424-PAdES-doc.pdf