特集
次世代XML Webサービスを試す Part 2

4.SOAPメッセージの完全性

インフォテリア株式会社
吉松 史彰
2002/11/21

Page1 Page2 Page3 Page4 Page5

 前半では、セキュリティ・トークンとは何かについて述べ、WS-Security仕様で規定されている内容のうち、WSDK(Web Services Development Kit)で実装されている、ユーザー名/パスワードおよびX.509v3証明書を使用したセキュリティ・トークンによるメッセージ認証を解説した。ここからの後半では、WS-Securityがサポートする、SOAPメッセージの改ざんを防止するためのデジタル署名と、機密を保持するための暗号化について、ここまでと同様にWSDKで試しながらその仕組みを解説していく。

SOAPメッセージの完全性の保証

 WS-Securityが取り扱うセキュリティ領域に、「メッセージの完全性」がある。メッセージの完全性とは、端的にはメッセージが転送の途中で改ざんされていないことを保証することだ。そのために有効な手段としてデジタル署名がある。WS-Security仕様には、W3CとIETFから発表されているXML署名仕様を利用して、SOAPメッセージにデジタル署名を施す手順が示されている。

 WSDKでは、前述のUsernameTokenとX509SecurityTokenの2つを使って、必要な要素にデジタル署名を施し、その内容をXML署名の形式でSOAPヘッダに添付できるようになっている。「必要な要素」とは、デフォルトではWSDKが作成するSOAPメッセージに含まれる次の6つの要素だ。

  • Body
  • Header/path/action
  • Header/path/to
  • Header/path/id
  • Header/Timestamp/Created
  • Header/Timestamp/Expires

 例えば、path要素に子要素を追加すれば、それも署名の対象になる。ただし、署名の対象を開発者がコントロールすることはできない。SOAPのBodyには署名したくない、Body全体ではなくBodyの一部だけ署名したい、という柔軟な操作は現状のWSDKでは実現できない。

 WSDKで、X509SecurityTokenを使ってSOAPメッセージにデジタル署名を施すには、クライアント側で次のコードを実装する(Part1で用いたWebサービス・クライアントの内容を、このコードで置き換える)。

localhost.Service1 svc = new localhost.Service1();

Microsoft.WSDK.SoapContext ctx = svc.RequestSoapContext;
Microsoft.WSDK.Security.Cryptography.X509Certificates. X509CertificateStore store =
  Microsoft.WSDK.Security.Cryptography.X509Certificates. X509CertificateStore.CurrentUserStore(Microsoft.WSDK.Security. Cryptography.X509Certificates.X509CertificateStore.MyStore);
if (!store.OpenRead())
  return;

Microsoft.WSDK.Security.Cryptography.X509Certificates. X509Certificate
 cert = (Microsoft.WSDK.Security.Cryptography.X509Certificates. X509Certificate)
  store.FindCertificateBySubjectString("WSDK Test")[0];

Microsoft.WSDK.Security.X509SecurityToken x509
  = new Microsoft.WSDK.Security.X509SecurityToken(cert);
ctx.Security.Tokens.Add(x509);
store.Close();

Microsoft.WSDK.Security.Signature sign
  = new Microsoft.WSDK.Security.Signature(x509);
ctx.Security.Elements.Add(sign);

string ret = svc.GetData();
Webサービス・クライアントでSOAPメッセージにデジタル署名を施すためのコード例

 ここではまず、クライアント・プログラムが動作しているコンピュータ上の証明書ストアにアクセスして証明書(Microsoft.WSDK.Security.Cryptography.X509Certificates.X509Certificate)クラスを取得している。先ほどのコードではこのクラスを、CreateCertFromFileメソッドを呼び出して、その引数にファイル名を渡して作成していた。しかし、デジタル署名を行うには秘密鍵が必要になる。通常は証明書のファイルには秘密鍵は含めない。従って、X509Certificateクラスをファイルから作成してしまうと秘密鍵がないので署名ができない。そのため、ファイルからではなく、秘密鍵を含んだ形で証明書が保管されている証明書ストアにアクセスしているのだ。

 証明書ストアにアクセスするには、X509CertificateStoreクラスのstaticメソッドであるCurrentUserStoreを、証明書ストアの名前を指定して呼び出せばよい。名前は「My」という文字列なのだが、定数が用意されているので上記のコードではそれを使っている。証明書ストアが取得できたらそれを開き(OpenRead)、中から名前を指定して証明書を検索する。X509CertificateStoreクラスには、FindCertificateByXXXというメソッドが4つあるが、ここではサブジェクトの名前の一部分から検索するFindCertificateBySubjectStringメソッドを利用している。本来、該当する証明書がいくつか見つかった場合は、X509CertificateCollectionクラスをループして利用するものを探さなければならないのだが、今回は1つしかないことが分かっているので、インデクサ([0])を使って最初の証明書を取り出している。

 証明書が取得できたら、次にトークンを作成して、セキュリティ・トークンとしてSOAPメッセージに追加する。このコードは先ほどのコードと同じだ。次に、デジタル署名を行うので、Microsoft.WSDK.Security.Signatureクラス(のオブジェクト)を作成する。Signatureクラスのコンストラクタに作成したセキュリティ・トークンを渡すと、それを使って決められた要素にWSDKがデジタル署名をしてくれる。SignatureクラスのオブジェクトをSOAPヘッダのSecurity要素に追加すれば、デジタル署名は完了だ。

 このコードで送信されるSOAPメッセージは次のようになる。なんとも目が回りそうな内容だが、これを手で書いたり、目で見たりして理解する必要がないのはいうまでもないだろう。

上記のコードで送信されるデジタル署名されたSOAPメッセージ例(IEで表示)

 このメッセージを受け取ったサーバ側([WebMethod])では、デジタル署名を検証するコードなどは一切書く必要はない。それはすべてWSDKが行ってくれる。正しく署名が検証できた場合は、検証に利用した証明書は、前述のCheckTokenのコードでUsernameTokenオブジェクトの代わりに、X509SecurityTokenオブジェクトを扱うようにすれば取得できる。CheckTokenのコードで[WebMethod]の行まで到達したということは、デジタル署名の検証に問題がなかったということなので、このSOAPメッセージに添付されてきた証明書の正当な持ち主がデジタル署名を行ったことを確認できたことになる。ということは、添付されている証明書が申告している「私は誰それです」という表明も認証されたことになる。


 INDEX
  特集 次世代XML Webサービスを試す Part 2
  WS-Security詳細解説
    1.WS-SecurityとWeb Services Development Kit
    2.セキュリティ・トークンと認証
    3.セキュリティ・トークンとしてのX.509v3証明書
  4.SOAPメッセージの完全性
    5.SOAPメッセージの秘匿性
 
 「特集:次世代XML Webサービスを試す」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間