XML暗号化の基礎と実践
後編 XML暗号化と電子署名の実践

前編の「XML暗号化と正規化と電子署名」では、XMLを利用するうえで必要なセキュリティと、それを支える仕様などをいくつか紹介した。SSLの利用、エレメント暗号、電子署名と正規化、XACML、XKMSといったものがそれぞれどのような役割を果たすのか、お分かりいただけただろう。今回は、これらの技術のいくつかを実際に利用できるように作られたツール「IBM XML Security Suite for Java(XSS4J)」を使って、実際にXMLのセキュリティ技術を体験してみよう。

米持幸寿 ・木下直樹
日本アイ・ビー・エム
2002/9/19


4. XMLセキュリティ・スイートを使う

■IBM alphaWorks

 IBMは、研究中または開発中のソフトウェアを、試用を目的に無償でダウンロードできるWebサイト「alphaWorks(アルファ・ワークス)」を開設している。ここではIBMが開発中の多くのXML関連ソフトウェアも公開されており、今回紹介するXSS4Jもアルファ・ワークスでダウンロードできる。

 アルファ・ワークスで配布されているソフトウェアは、基本的には90日間無償で試すことができる。試用版という位置付けだが、一部のソフトウェアはライセンスを購入すれば業務に利用したり、市販ソフトウェアに含めたりすることができる。

 今回は、XMLエレメント暗号、実システムで実用化されているXML電子署名などを紹介する。

■暗号や電子署名のライブラリを提供するXSS4J

アルファ・ワークスの画面
XSS4Jは、アルファ・ワークスの「XML Security Suite」のページのダウンロードボタン(赤で囲ったところ)をクリックして、ダウンロードする

 まずは、XSS4Jを紹介しよう。XSS4Jでは、以下の機能を提供するライブラリが含まれており、Javaアプリケーションから簡単に呼び出して使うことができる。

  1. XMLエレメント暗号
  2. XMLアクセス制御
  3. ASN.1/XML変換
  4. XML電子署名
  5. DOMHASH計算
  6. XML正規化

 XSS4Jに含まれているそれぞれのライブラリは、作ったエンジニアも、作られたタイミングも違うため、必要とするライブラリやバージョンが少しずつ違う点に注意が必要だ。例えば、XMLエレメント暗号ライブラリは、XMLパーサとしてXerces 2.xを必要とするが、XML電子署名ライブラリはXerces 1.xを必要とする。この場合、Xerces 1.xはJava 1.x用で、Xerces 2.xはJava 2.x用なので、XMLエレメント暗号とXML電子署名を同じJava VM上で行うことは困難である。

 XSS4J全体に共通していえることは、各ライブラリが要求する「前提ソフトウェア」は、厳密に正しいバージョンを要求する、ということである。バージョンが新しければいいだろうと思うと、なくなったクラスがあったりしてうまく動かない。このへんは、オブジェクト指向ライブラリのバージョン管理の難しさを露呈しているともいえる。JCPのありがたさを実感する。

 前提になる各パッケージを入手するには、XSS4Jのドキュメントにリンクがあるので、それを利用しよう。ダウンロードするときは、最新版をダウンロードするのではなく、要求されているバージョンをダウンロードすること。最新版ではクラス名やパッケージ名が変更になっていて動作しないものがある。

 XSS4Jには、2001年1月29日版、2001年10月29日版、2002年4月22日版がある。それぞれのバージョン間で、XSS4Jのライブラリ中に名前が変更になったクラスがあるので(SignatureGenerator→TemplateGenerator、DigestMethod→XSignatureなど)、以前のバージョンで作ったアプリケーションが新しいバージョンで動かなくなることがある。これも注意したい。こうした点も、いかにもアルファ・ワークスで公開されているコードらしい。この記事では2002年4月22日にポストされたパッケージを利用して解説する。ダウンロードは、アルファ・ワークスの「XML Security Suite」のページから行う。

 XSS4Jには特別なインストーラはない。完全なJavaライブラリであり、ZIPファイルで配布されている。今回は動作確認にWindowsを使っているが、LinuxやOS/390のような、ほかのプラットフォームでも、ZIPファイルを適当なディレクトリに展開し、必要なJARファイルにクラスパスを通せば動く。

■XMLエレメント暗号

 ではまず、XML文書の暗号化機能を試してみよう。「XML Encryption Implementation」という名前の機能である。これは、XML文書の部分的な暗号化であるXMLエレメント暗号を実現する(XMLエレメント暗号については前編参照)。この機能を利用するための前提パッケージは以下のものである。

  • JDK 1.3以上
  • Java Cryptography Extension (JCE) 1.2.1
  • Xerces2 Java Parser 2.0とサンプル
  • Xalan-Java 2.3
  • International Components for Unicode for Java 2.0(ICU4J)

 それぞれの入手方法について説明しておこう。JDKは、サン・マイクロシステムズのJava.Sun.Comサイトの「Downloads」ページから取得できる。J2SE 1.3.1 Japanese Editionあたりを選択すればよいだろう。JCE 1.2.1も、Java.Sun.Comサイトの「Java(TM) Cryptography Extension (JCE) 1.2.2」のページの下の方にある「Downloads」のリンクから取得できる。

 Xerces2は、The Apache Software FoundationXerces 2 Java Parser Readmeの左側にある「Download」メニューから取得でき、Xalanは同じサイトの「Xalan-Java version」 ページの下の方にある「Where do I get Xerces?」の欄のリンクからたどるといいだろう。ICU4Jは、IBMの「International Components for Unicode for Java」で公開されている。左側にある「download」のリンクをクリックすると取得できる。

 ちなみに、IBMが提供するJDKにはJCEが含まれているので、筆者はIBMのJDKのJCEパッケージをそのまま使っている。ICU4Jは、ドキュメントには2.1が前提と書いてあるが、実際にはICU4J 2.0と組み合わせないと動作しない。

■カード番号を暗号化する

 それぞれをインストールしたら、実際にXMLエレメント暗号を試してみよう。データは「XSS4Jパス\data\enc」以下のものを使い、サンプル・プログラムである「enc.DOMCipher」を使って暗号化してみる。まずは、準備されているデータを見よう。

<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a sample document. -->
<Invoice>
  <bookorder>
    <item>
      <title>XML and Java</title>
      <quantity>1</quantity>
      <price>100.0</price>
    </item>
  </bookorder>
  <payment type="card">
    <issuer>A Card Company</issuer>
    <amount>100.0</amount>
    <due>10/10/1999</due>
  </payment>
  <cardinfo>
    <name>Your Name</name>
    <expiration>04/2001</expiration>
    <number>5283 8304 6232 0010</number>
  </cardinfo>
</Invoice>
リスト1 Bookorder.xml

 ご覧いただいて分かるように、これは書籍の注文データである。注文データは大きく分けて、書籍の情報、支払い情報、カード情報に分かれている。その内容を見ると、100ドルの「XML and Java」という本を1冊購入し、「A Card Company」で1999年10月10日までに100ドルを払う、カード名義は「Your Name」、カード期限は2001年4月、番号は……、という情報である。

 この「cardinfo」の部分を暗号化してみる。つまり、発注書を受け取った店ではクレジット・カード番号を読めないようにするのが目的である(一方で、この発注書はクレジット・カード会社にも転送される。クレジット・カード会社には暗号化されたクレジットカード番号を読めるようにする)。

 XML文書を暗号化するには、サンプル・プログラム「DOMCipher」を使う。暗号化には、暗号用の「キー」の情報を渡す必要があるため、ここでは、キーの情報が入った以下のファイルを使う。

  <?xml version="1.0" encoding="UTF-8" ?>
- <!--
  This is a sample keyinfo containing information on a keystore
  named "keystore1" in the same directory.

  -->

- <keyinfo>
- <keystore>
  <name>keystore1</name>
  <type>jceks</type>
  <password>storepass</password>
  </keystore>
- <keys>
- <key>
  <alias>Alice</alias>
  <password />
  </key>
- <key>
  <alias>Bob</alias>
  <password>keypass</password>
  </key>
  </keys>
  </keyinfo>
リスト2 keyinfo1.xml 暗号化のためのキー情報が入っている

 実行にはenc.DOMCipherを呼び出すわけだが、JARファイルがかなりたくさんあるので、ライブラリ拡張機能を使った方が簡単である。以下のバッチファイルを参考にしてほしい。パスの順番は重要で、特にXercesのJARファイルがパスの先頭に来るようにした方がよい。バッチファイルの中の「Keytool」コマンドと、最後の「java」コマンド以降はそれぞれ1行であるので、気を付けていただきたい。

set xss4j_home=D:\_work\xss4j
set xss.encryption=
set xss.encryption=%xss.encryption%;D:\IBMJava13\jre\lib\ext
set xss.encryption=%xss.encryption%;D:\_work\xerces-2_0_2
set xss.encryption=%xss.encryption%;D:\_work\xalan-j_2_3_1\bin
set xss.encryption=%xss.encryption%;D:\_work\icu4j.2.0
set xss.encryption=%xss.encryption%;%xss4j_home%

set classpath=%xss4j_home%\samples;%classpath%
set datapath=%xss4j_home%\data\enc

Keytool -genkey -alias Alice -keyalg RSA -dname "CN=Naoki Kinoshita,OU=ISE,O=IBM,C=JP" -keypass keypass -keystore keystore1 -storepass storepass

java -Djava.ext.dirs=%xss.encryption% enc.DOMCipher -e %datapath%\keyinfo1.xml %datapath%\bookorder.xml "//*[name()='cardinfo']" %datapath%\template1.xml > result.xml
リスト3 enc.bat(改行個所にはマークを付加した)

 暗号化されたXML文書は標準出力へ出力される。上記のバッチファイルでは、リダイレクトされてresult.xmlファイルに出力されている。result.xmlには、次のようなXML文書が格納されている。

<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a sample document. --> <Invoice>
  <bookorder>
    <item>
      <title>XML and Java</title>
      <quantity>1</quantity>
      <price>100.0</price>
    </item>
  </bookorder>
  <payment type="card">
    <issuer>A Card Company</issuer>
    <amount>100.0</amount>
    <due>10/10/1999</due>
  </payment>
  <EncryptedData Id="ed1" Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
  <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">     
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">     
        <KeyName>Alice</KeyName>
      </KeyInfo>
        <CipherData>
          <CipherValue>Dh30Pt0bP0I+Smxp/Xm2oAE0huqzZp2t1JvqIK
5/HpRAgbwBG3MJQ8D0xbRWH7vlHKWSek9H076Rd5NgDMv8o8Ve2nCtxPhlvwg
l1cf/BXJ0XiCQXKUo7LJdS63L8AuLPr0rOm57emaNsAy G/YuaLc9kHKcB/Ld
x+OHxSoGSKBc=</CipherValue>
        </CipherData>
      </EncryptedKey>
    </KeyInfo>
    <CipherData>
      <CipherValue>t8sTntehgUT1DDL3r36vjJp+YiCIjlSmEQHhW6c5KC
Wy1jGu0p2rsHl6oxBejIMIBH1Ii0w1HsA3CWGgW9+gs5c7kWB6sI2a/qMg70Y
PjJQjvniHF3xcVE0ihesOkgx1qdh2tVJ2E9tZpKq9bziwqektsSrFZ7t/dNnu
Z3ZsQhSu3dt86wRkIJK1tCvJt6I</CipherValue>
    </CipherData>
  </EncryptedData>

</Invoice>
リスト4 result.xml (リストを見やすいように、適宜改行を入れてある)

 青く色を変えている部分が暗号化された部分である。Keyinfo以下にキー情報が、CipherData以下に暗号化されたデータが保存されている。

 DOMCipherのソースコードは「samples/enc」の下にあるので、参考にしてほしい。

4/6

Index
XML暗号化の基礎と実践
前編〜XML暗号化と正規化と電子署名
  1. SSLの利用とXML暗号化の違い
  2. 電子署名とXML文書の正規化
  3. XML文書のアクセスポリシーとシングル・サインオン
後編〜XML暗号化と電子署名の実践
4. XMLセキュリティ・スイートを使う
  5. XML文書に電子署名をしてみる
  6. 署名された文書の改ざんを検証



XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間