Webサービスのセキュリティ概要」は、Webサービス・セキュリティのフレームワークの概要を述べた。今回はWebサービス・セキュリティの最も基本となるXMLデジタル署名とXML暗号について述べる。XMLデジタル署名とXML暗号は従来のASN.1で定義されたCMS署名フォーマットやCMS暗号フォーマット*1に比べてXML文書との親和性が高く、柔軟な署名や暗号化が可能となる。Syntax:RFC2630)を定めた標準でASN.1で定義されデジタル署名や暗号メッセージの構文を規定している。Signature標準のRFC3075*2を定めた。XMLデジタル署名は、署名アルゴリズム、証明書や署名のタグを定め、任意のデータに対する署名のほか、XML文書の指定したエレメントやコンテントに対して署名を付けることを可能にしている。XMLデジタル署名には、以下の特徴がある。署名対象、署名アルゴリズムや署名値および証明書などをXMLの文法で統一して表現できる。デジタル署名がXMLタグ付き言語であり、ASN.1構文に比べて分かりやすい。任意のデータファイルやXML文書の全体だけではなく、XML文書の一部に対しても署名を付けることができ、部分署名や多重署名などの複雑な要件に対応できる。Identifier)を指定するのに対して、W3Cなどで定めているURIを参照する。WGhttp://www.w3.org/Signature/●XML署名の構文XML署名は、指定した署名対象に対するデジタル署名である。署名対象のダイジェスト値(ハッシュ値)を求め、ダイジェスト値を子要素としてXML署名情報要素に入れ、さらにその署名情報要素に対してダイジェスト値と署名値を計算し挿入する。参照URIで指定される署名対象のデータがXML文書であった場合、ダイジェスト値を計算する前にそのXML文書の正規化(Canonicalization:C14N)を行う必要がある。それはXML文書では内容が同じであってもXML構文に挿入された空白文字や改行などが任意に加わると表現が異なり、結果としてダイジェスト値が変わり、署名値が異なってしまうからである。XML文書の正規化処理はW3Cのデジタル署名ワークグループ(WG)とIETFで標準化を行っている(RFC3076)。XML署名には鍵情報(KeyInfo)要素を指定することができ、ここに必要なら署名検証鍵を指定し、その公開鍵証明書としてX.509証明書などを示すことができる。XMLデジタル署名は下記のようにSignature要素として記述される。ここで、“?”は0または1、“+”は1または1以上、“*”は0または0以上を意味し、<!--xxx-->の部分は各要素のコメントである。●XML署名の種別XML署名にはURIで示す署名対象の指定方法の違いで以下のような3つの署名形式がある。elements)である。Detached署名は、署名対象データに任意の電子ファイル(Word、Excel、MPEG画像データ、XML文書など)を指定して、署名対象データをXML署名部分とは独立させ外部ネットワークやローカルファイルに置くことができる。XML文書内にXML署名要素とXML署名対象要素を並列に配置させることもできる。署名要素が署名対象要素の子要素となる署名形式である。Enveloped署名は同じ文書に複数人の署名を付けるなどの用途に適している。署名要素が署名対象要素の親要素となる署名形式である。Enveloping署名は署名対象要素を包含した形式で、医療のカルテのように初めの医師が署名したカルテに、次の医師が新しく書き添えた部分のみに署名を加えていくような用途に適している。element:正規化変換)を適用して、署名対象を生成する。署名対象のダイジェスト値を計算する。element)を生成する。参照要素は署名対象識別子URI(オプション)、XML正規化変換プロセス要素(オプション)、ダイジェストアルゴリズム要素とダイジェスト値要素を含む。element)を生成する。正規化アルゴリズムによる正規化を行った後、署名アルゴリズムに基づいて、署名情報要素に対する署名値(SignatureValue)を計算する。オプションとして署名検証のために鍵情報要素(KeyInfo)を加える。これには署名検証用の公開鍵をBase64でエンコードした値と、X.509証明書などの情報を加えることができる。オプションとして被署名データオブジェクトとなるオブジェクト要素を指定できる。オブジェクトとしては画像データなどバイナリをBase64でエンコードしたものやMIMEオブジェクトなどのデータ属性を指定する。element)を構成する。●XML署名の検証処理XML署名の検証処理には、参照要素検証と署名検証の2つのステップが含まれる。参照要素検証では、署名情報要素内の各参照要素のダイジェスト値を検証する。署名検証では、署名情報要素に対して計算された暗号化署名値を検証する。注意すべきなのは、XML署名は正確に記述されている場合でも、一部の署名検証アプリケーションでは検証できないことである。署名はXMLデジタル署名仕様のオプション部分があり、特殊なアルゴリズムが含まれ、または特別な識別子(URI)を参照する場合、署名検証アプリケーションはその署名に対応できないことがある。署名情報要素(SignedInfo)に記載される正規化変換や署名方法で参照要素URIにより指定された被署名データと署名値が検証対象になる。署名情報要素内の各参照要素に対して、下記の参照要素検証を行う。参照要素内の署名対象識別子URIを参照し、オリジナル署名対象を取得する。elementを適用した結果が署名検証対象になる。参照要素内に記述されるダイジェストアルゴリズム(DigestMethod)を用いて、署名対象のダイジェスト値を計算する。element)内に記述されるダイジェスト値を比較する。一致しなければ、検証は失敗となる。elementまたは外部リソースから鍵情報を取得する。鍵情報要素(KeyInfo)にある、または、そのほかの方法で取得した公開鍵証明書の有効性を検証する。署名アルゴリズムと鍵情報の有効な公開鍵を使って、署名値を復号しダイジェスト値を求める。求めたダイジェスト値と署名文書のダイジェスト値を比較し、署名を検証する。以下にDetached署名の例を示す。正規化アルゴリズム、署名アルゴリズム、参照要素(ダイジェストアルゴリズム、ダイジェスト値)、署名値および鍵情報などの要素の使用方法が示されている。各参照要素ダイジェスト値の検証という2つの検証プロセスが必要である。署名値そのものは署名情報要素外に存在するのに対して、署名値を計算するためのアルゴリズムは署名情報要素に含まれる。element)を正規化する。アルゴリズムはダイジェストアルゴリズム、鍵依存アルゴリズムおよびそのほかのアルゴリズム(例RSA-SHA1)の集合である。アプリケーションの互換性を高めるために、W3CはXML署名アプリケーションの実装に必須なアルゴリズム、推薦アルゴリズム、オプションのアルゴリズムおよびユーザー策定アルゴリズムの仕様を規定している。[s05]:参照要素のURI属性(オプション)として、署名対象の参照URIを記述する。[s06〜08]:署名対象のダイジェスト値を計算する前に、オリジナルの署名対象の処理プロセスを記述する変換プロセス要素(オプション)。オリジナルの署名対象の正規化、エンコード/デコード、XSLT、XPathなどのオペレーション仕様は変換プロセス要素内に記述される。この要素を記述しない場合、オリジナルの署名対象に対して直接ダイジェスト値を計算することになる。