LangEdge,Inc.

1

JNSA電⼦署名WG五⽉祭、もう紙の時代じゃない︕

オープンソース⻑期署名 FreeXAdES

第1回 〜XAdES-BES編〜

宮地（miyachi@langedge.jp）

２０１６年５⽉２３⽇

LangEdge,Inc. : FreeXAdES 2016/05/23

2

本題の前に…⾃⼰紹介
miyachi naoto（宮地 直⼈）
有限会社ラング・エッジ プログラマ ⾃社製品︓XAdES/PAdESライブラリ開発
 受託開発︓PKI系・ドキュメント（PDF）系他
http://www.langedge.jp/

JNSA電⼦署名WGサブリーダー

 スキルアップTFリーダー（イベント好きですw）
 普及活動︓PKI Sandbox Project/勉強会
 公開活動︓FreeTSA（タイムスタンプサーバ）
http://eswg.jnsa.org/

LangEdge,Inc. : FreeXAdES 2016/05/23

3

オープンソースのXAdES
xadesjs - JavaScript実装のXAdES
https://www.npmjs.com/package/xadesjs

 最近公開されたPure JavaScriptな新実装
 webcryptoを使って実装されている
 kjurさんがそのうちきっと試して情報が出てくる…

OpenXAdES - エストニアのオープンソース
http://www.openxades.org/ だったのだけど…
→ http://www.id.ee/ の下に⾶ばされる…

 昔からあるけどDigiDocの⼀部になった︖
 DigiDocはC/C++/Java版がありソース⼊⼿可 DigiDocは LGPKI v2.1 で公開されている

LangEdge,Inc. : FreeXAdES 2016/05/23

4

JavaでフリーなXAdESライブラリ︖
XAdES⽣成はXML署名を使えば簡単!?
 Java6以降でXMLSignatureをサポート
 .NETではSignedXmlをサポート※ Java/.NETでのXAdES提供の⽇は近い︖

依存が少ないXAdES実装があると便利 xadesjsもOpenXAdESも使うのが⾯倒…
 Java標準機能だけで実装できないか︖

⻑期署名普及と勉強の為に作りますか…
 Java標準だけでFreeXAdESを作る
 JNSA勉強会ネタとして1年間かける

今ココLangEdge,Inc. : FreeXAdES 2016/05/23

5

FreeXAdES
⼊⾨/勉強⽤にシンプルなXAdESを実装※ ⾼度な機能が必要なら弊社製品版のご検討を…(^^;

Java標準機能で実装（他に依存しない）
 簡単でシンプルに使えること。

XAdESレベル毎に勉強会で説明して⾏く 本⽇が第1回です︕次回からスキルアップTFで。

MPL v2.0 (Mozilla Public License) で公開
http://mozilla.org/MPL/2.0/
 ソースを公開し、商⽤利⽤も可能です。

6

LangEdge,Inc. : FreeXAdES 2016/05/23

MPL v2 ライセンス
ソース公開義務

GPL

MPL

BSD

OSS本体への修正/追加分〇〇×××

OSSを利⽤したプログラム公開必須〇公開必須

公開必須 公開不要

公開不要 公開不要

私の理解：間違っていたらご指摘ご指導をm(_ _)m FreeXAdESを使うプログラム/システムはソース公開義務無し
 FreeXAdES自体を修正したら修正部はソース公開義務あり※ 可能ならGitHubに修正分を反映ください！

LangEdge,Inc. : FreeXAdES 2016/05/23

7

FreeXAdES 公開（現在BES-β1版）
公開リポジトリhttps://github.com/miyachi/FreeXAdES

開発環境
Eclipse IDE for Java Developers
Version︓Mars.2 Release (4.5.2)Java環境︓Java8 (JDK/JRE 1.8.0)
その他︓JUnit4を利⽤※ Java7以前の環境はそのままでは動作しません。
※ GitHubとEclipseの使い⽅は説明しません。

8LangEdge,Inc. : FreeXAdES 2016/05/23

Java環境とXML署名XAdESの実装にXML署名とBase64が必要。
機能Java 5

javax.xml.crypto.dsig.

××XMLSignaturejava.util.

Base64Java 6Java 7〇〇
× ※1 × ※1

Java 8〇〇※1 非標準の org.apache.commons.codec.binary.Base64 は利用可能。

XMLコンソーシアム セキュリティ部会「署名ツール検証報告書 2010年01月27日」

Java6と.NETのXML署名利用と相互運用性

http://xmlconsortium.org/public_doc/securitytool/SignToolVerificationReport20100127.pdf

9LangEdge,Inc. : FreeXAdES 2016/05/23

XML署名と⻑期署名XAdES
注:XML署名済みファイルをXAdES化はできない︕
機能

XML署名

XAdESレベル

デジタル署名〇
署名証明書保護▲ ※1
署名時刻証明 × TS使えない〇 XAdES-B

検証情報保持⻑期保管（⻑期署名）▲ ※2（XAdES-BES）〇 XAdES-T〇 XAdES-LT（XAdES-X Long）

XAdES-LTA× TS使えない 〇 （XAdES-A）※1 KeyInfo を参照（Reference）追加すれば可能。
※2 証明書認証パスの証明書群は KeyInfo の下に格納可能。

LangEdge,Inc. : FreeXAdES 2016/05/23

XAdESのXML構造例

10

XML署名要素にXAdES要素を追加することでXAdES化

Signature（XmlDsig︓ルート）
SignedInfo（XmlDsig︓署名情報）
Reference URI=“#Sign-Target”（対象参照）
Reference URI=“#XAdES-Sign-Atrb”（XAdES参照）
SignatureValue（XmlDsig︓署名値）
⾮署名属性領域にKeyInfo（XmlDsig︓鍵情報）
ついては次回以降!
Object（XmlDsig︓XAdESオブジェクト）
QualifyingProperties（XAdES︓属性情報）
SignedProperties Id=“XAdES-Sign-Atrb”（XAdES︓署名属性領域-署名証明書ハッシュ値等）
UnsignedProperties（XAdES︓⾮署名属性領域）
Object Id=“Sign-Target”（XmlDsig︓署名対象）

LangEdge,Inc. : FreeXAdES 2016/05/23

11

XAdES のバージョン
⼤きく分けてv1.3.2とv1.4.1の実装が必要
v1.4.1は追加要素のみでベースはv1.3.2
 v1.3.2 = v1.3.2
 v1.4.1 = v1.3.2 + v1.4.1※ v1.3.1はv1.3.2とは別の名前空間で別仕様※ v1.4.2はv1.4.1のバグ修正で同じ名前空間

v1.4.1の以下の2要素を追加/変更が重要
 TimeStampValidationData 新規追加
 ArchiveTimeStamp（v1.4.1）仕様変更※ EN化されたETSI最新も基本v1.4.1である。

12

LangEdge,Inc. : FreeXAdES 2016/05/23

XML署名の署名⽅式
⼤きく分け以下4種類で組み合わせ利⽤も可
署名⽅式

機能

概要

外部Detached 外部参照

外部ファイルを参照
署名ファイルは別管理☝XML以外も参照可能

内部Detached 内部参照

同⼀XML内を参照
署名の⼦要素は不可

Enveloping
Enveloped

対象内包

署名対象を署名内にObjectとして含み参照☝XML以外も利⽤可能

埋め込み

⼀般のXML情報の中にXML署名要素を埋め込む☟複数Envelopedは不可

13LangEdge,Inc. : FreeXAdES 2016/05/23

外部Detached（外部参照）
URI指定（間接可）で外部ファイルを参照<Signature>
DetachedOut.xml<SignedInfo><Reference URI="target.xml"></SignedInfo>…
XMLファイル以外でも</Signature>

バイナリ扱いで指定可能<MyData><Data>…</Data></MyData>

Target.xml〇 署名ファイル⾃体が⼩さくシンプルなので良く使われている〇 バイナリ扱いによりXML以外に何でも署名対象に可能
× 署名ファイルと署名対象は別ファイルとして別管理が必要

14

LangEdge,Inc. : FreeXAdES 2016/05/23

内部Detached（内部参照）
同⼀XMLファイル内の別要素をId指定で参照<MyData><Data Id="D1">…</Data><MySign><Signature><SignedInfo><Reference URI="#D1"></SignedInfo>…
</Signature></MySign></MyData>

埋め込み場所はどこでも良い
DetachedIn.xml〇 署名対象のXML構造を崩さずに署名の埋め込みが可能〇 複数Detachedにより複数の署名対象を指定可能
× XML要素のみ署名対象として可能

15

LangEdge,Inc. : FreeXAdES 2016/05/23

Enveloping（対象内包）
署名対象をObject要素下に含み参照<Signature><SignedInfo><Reference URI="#MyObjId"></SignedInfo>…
<Object Id="MyObjId"><MyData><Data>…</Data></MyData></Object></Signature>

Enveloping.xml

Base64化してバイナリ情報も埋め込み可能〇 電⼦封筒として複数の署名対象を1つのファイルにできる〇 Base64化によりXML以外に何でも署名対象に可能× 署名がメインであり内包されたデータの利⽤が少し⾯倒

16

LangEdge,Inc. : FreeXAdES 2016/05/23

Enveloped（埋め込み）
署名対象XMLの中にXML署名を埋め込む<MyData><Data>…</Data>

Enveloped.xml

URIが空だと全体が範囲<Signature><SignedInfo><Reference URI="">…<Transform Algorithm="…#enveloped-signature">…

</Reference></SignedInfo>…
</Signature>

XPathのTransformで署名場所の指定可能</MyData>〇 署名対象のXML構造を崩さずに署名の埋め込みが可能〇 ⽐較的良く使われている（考え⽅がシンプル）× Enveloped可能な署名対象は1つで、複数は不可LangEdge,Inc. : FreeXAdES 2016/05/23

17

XML署名の署名⽅式まとめ
元のXML構造をそのまま⽣かして署名したい 内部Detachedを選択（Id名は固定にする）
⼀部のみか複数要素を対象にするなら内部Detachedが良い Envelopedを選択（基本全体が署名対象）
ほぼ全体を対象にするならEnvelopedが良い

⼤量の外部ファイルにまとめて署名したい 外部Detachedを選択（別管理が必要）

1つの署名ファイルに全てを⼊れて管理したい Envelopingを選択（バイナリは⼤きくなる）※複数署名⽅式を組み合わせることも可能!

18

LangEdge,Inc. : FreeXAdES 2016/05/23

FreeXAdES 利⽤サンプル
JUnit4の IFreeXAdESTest.java 参照!
testDetachedOut
testDetachedIn
testEnvelopingXml
testEnvelopingBase64
testEnveloped
testVerify：外部Detached試験：内部Detached試験：Enveloping試験(XML)：Enveloping試験(Binary)：Enveloped試験；検証試験（共通 ※）※ 検証試験は testDetachedIn で失敗する為に簡易実装。

各試験で利⽤する⼊⼒ファイルと⽣成されたXAdESファイルは test フォルダ下にある。

LangEdge,Inc. : FreeXAdES 2016/05/23

19

FreeXAdES 利⽤⼿順例（署名⽣成）
1. インスタンス⽣成・初期化設定
 setRootDir / setHashAlg （オプション）

2. オプション︓XMLの読み込み setXml / loadXml （内部DetachedかEnvelopedのみ）

3. 署名対象の追加（複数呼び出し可） addDetached / addEnveloping / addEnveloped

4. XAdES署名実⾏（P12ファイル指定）
 execSign

5. XAdES署名結果の取得/保存
 getXml / saveXml

LangEdge,Inc. : FreeXAdES 2016/05/23

20

FreeXAdES オプション
ルートディレクトリ指定

 外部Detachedのファイル位置ベース指定可ハッシュアルゴリズム指定

 SHA256(標準)/SHA512/SHA1指定可

C14N正規化アルゴリズム指定

 TRANS_C14N (標準)/TRANS_C14N_EX指定可

XAdESオブジェクトを追加しない NO_XADES_OBJ (標準オフ) 指定するとXML署名

SigningTime 出⼒しない NO_SIGN_TIME (標準オフ)

21

LangEdge,Inc. : FreeXAdES 2016/05/23

Java8 の XMLSignature 問題1
Enveloping参照先のハッシュ計算が異常︕
Java6（2010年）の時代からあった。
「互換性、課題と対策 〜XML署名ツール検証報告〜」
XMLコンソーシアムWeek2010 発表資料
http://xmlconsortium.org/seminar09/100310-11+16-18/data/100316/20100316week-wgsec-3_2-signtool.pdf<Signature><SignedInfo><Reference URI="#MyObjId"></SignedInfo>…
<Object Id="MyObjId"><MyData xmlns=“"><Data>…</Data></MyData></Object></Signature>

Enveloping.xml

署名対象

名前空間名(xmlns)が指定されていない

Java生成結果
は他実装では検証エラーに

LangEdge,Inc. : FreeXAdES 2016/05/23

22

名前空間無し Enveloping● 署名対象のオリジナルXML<Object Id="MyObjId" xmlns="http://www.w3.org/2000/09/xmldsig#"><MyData xmlns=""><Data Id="D1">book</Data</MyData></Object>● 正しいハッシュ値の正規化後のXML（注︓改⾏が追加されています）<Object xmlns="http://www.w3.org/2000/09/xmldsig#" Id="MyObjId"><MyData xmlns=""><Data Id="D1">book</Data></MyData></Object>● Javaハッシュ値の正規化後のXML（注︓改⾏が追加されています）<Object xmlns="http://www.w3.org/2000/09/xmldsig#" Id="MyObjId"><MyData><Data Id="D1">book</Dat></MyData></Object>

MyData要素の空名前空間 xmlns="" が省略されている…
※ 名前空間に何か指定すれば問題無くなるので回避可能。

LangEdge,Inc. : FreeXAdES 2016/05/23

23

名前空間/Id指定あり Enveloping● 署名対象のオリジナルXML<Object Id="MyObjId" xmlns="http://www.w3.org/2000/09/xmldsig#"><MyData Id="D1" xmlns="http://testns"><Data>book</Data</MyData></Object>● 正しいハッシュ値の正規化後のXML（注︓改⾏が追加されています）<Object xmlns="http://www.w3.org/2000/09/xmldsig#" Id="MyObjId"><MyData xmlns="http://testns" Id="D1"><Data>book</Data></MyData></Object>● Javaハッシュ値の正規化後のXML（注︓改⾏が追加されています）<Object xmlns="http://www.w3.org/2000/09/xmldsig#" Id="MyObjId"><MyData Id="D1" xmlns="http://testns"><Data>book</Dat></MyData></Object>

MyData要素の名前空間属性とId属性の順番が逆だぞ…

LangEdge,Inc. : FreeXAdES 2016/05/23

24

Java8 の XMLSignature 問題2
内部Detachedのハッシュ計算に失敗する︕
Java6では正常に動作していた。
Java6と同じソースでJava8ではエラーに。
Java8署名時も検証時もエラーになってしまう。
 FreeXAdES署名時は⾃分でハッシュ値計算
 FreeXAdES検証時はまだ未実装※ 何かAPIを追加する必要があるのかも…

Javaのバグとして報告しなきゃ…orz

LangEdge,Inc. : FreeXAdES 2016/05/23

25

FreeXAdES BES-β1版の課題
1. 内部Detachedの署名値検証に失敗する
 署名は対応済みなのでToDo項⽬です。

2. 署名⽤の秘密鍵/証明書がPKCS#12のみ
 P8の署名ツール検証報告書を⾒よ︕

3. XAdES要素（署名属性）⼀部のみ実装
 SigningCertificate/SigningTime のみ。

4. 署名したインスタンスでそのまま検証できない ⾯倒なので検証できないように変更予定。

5. 速度やメモリ利⽤量の調整等はしていない まあこれはおいおい確認して対応で…

LangEdge,Inc. : FreeXAdES 2016/05/23

26

以上で今回は終了︕
次回第2回〜XAdES-T編〜「タイムスタンプを使おう︕」
次回は電⼦署名WGスキルアップTF（JNSA会員のみ）で7⽉開催予定!
⾮会員なら是⾮JNSA にご⼊会を!
http://www.jnsa.org/