今更、WSE 3.0 を使う

久々の更新です。

ようやく、MCP 試験 70-553(4月に合格)、70-554 の 2 科目の受験 & 合格で、MCPD へのアップグレードが終わりました。
なかなか時間が取れず、ようやく受験することができました。いやぁ、きつかったです。

 

今回はせっかくなので、この MCP 試験に関係する話題にしようと思います。
すでに、Visual Studio 2008 がリリースされているわけですが、今回はあえて Visual Studio 2005 で使う
WSE (Web Services Enhancements) 3.0 についてのネタです。
すでに、WCF (Windows Communication Foundation) がリリースされているわけで、すっかりと WSE は
旧モデルになってしまったわけですが、WSE 3.0 は、MCPD EA には必要な項目(要するにテスト範囲ね)だったりするのです。

以前あった Web Services Enhancements (WSE) Home サイトも今では WCF のトップページに置き換わり…
ただ、MSDN には、少しだけコンテンツがありました。

Web Services Enhancements 3.0

この WSE 3.0 ですが、

  • WS-Security
  • WS-Routing
  • WS-Attachments
  • WS-Policy
  • WS-SecurityPolicy
  • WS-Trust
  • WS-SecureConversation,
  • WS-Addressing
  • Message Transmission Optimization Mechanism (MTOM)

に対応しています。

そもそも、WSE って英語版のアドオンツールなので、UI もすべて英語なんですよね。
今回は一番使うであろう “Web サービスと Web クライアントの間を暗号化するポリシーを作成する” に
したいと思います。

手っとり早く、XML Web サービスの雛型を使います。
[WebService(Namespace = “http://localhost/WSSecurityAnonymous2”)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WSSecurityAnonymousService2 : System.Web.Services.WebService {
    public Service () {
    }

    [WebMethod]
    public string HelloWorld() {
        return “Hello World”;
    }
}
Visual Studio 2005 の Web サービスのプロジェクトで右クリックすると
一番下に “WSE Settings 3.0 …” というメニュー項目がありますので、それをクリックしましょう。すると、

の画面が表示されます。この General タブの項目では、

Enable this project for Web Services Enhancements
Enable Microsoft Web Services Enhancements Soap Protocol Factory

の 2 つともクリックしておいてください。
つぎに Policy タブをクリックしてください。

Enable Policy をチェックして、Add ボタンをクリックしましょう。
その際、一意になる名前を入力しておきます。(今回は、ServerPolicy とします(*1))
すると、ウィザードが立ち上がります。

次に進めて、Authentication Settings (認証の設定)を行います。Web サービス側の設定をするので

Secure a service application

をクリックします。そして、クライアントの認証方式ですが、Anonymous を選択します。

なお、クライアントの認証方法は、以下を選択することができます。

  • Anonymous
    – Web クライアントからクレデンシャルが送信されないので、承認セキュリティは有効化されない。
     Web クライアントと Web サービスは、サーバーの公開証明書を使用して通信をセキュアにする。
     ポリシーファイルの anonymouseForCertificateSecurity 要素を使用する。
  • Username
    – Web クライアントからユーザー名/パスワードのクレデンシャルが送信される。
     Web クライアントと Web サービスは、サーバーの公開証明書を使用して通信をセキュアにする。
     ポリシーファイルの usernameOverTransportSecurity または usernameForCertificateSecurity 要素を使用する。
  • Certificate
    – Web クライアントからクライアント証明書が送信される。
     Web クライアントと Web サービスは、サーバーの公開証明書を使用して通信をセキュアにする。
     ポリシーファイルの mutualCertificate11Security または mutualCertificate10Security 要素を使用する。
  • Windows
    – Web クライアントからユーザー/サービスクレデンシャルとして Kerberos チケットが送信される。
     Web クライアントと Web サービスは、クライアントの Kerberos チケットを使用して通信をセキュアにする。
     ポリシーファイルの kerberosSecurity 要素を使用する。

次に進めると、Message Protection (メッセージ保護) の設定になります。
今回は送受信の SOAP メッセージを暗号化するので Sign and Encrypt を選択します。

なお、保護レベルは、以下を選択することができます。

  • None
    – 保護は有効化されず、トランスポートレベルのセキュリティが使用される (Username クライアント認証においてのみ利用可能)。
     WSE 3.0 では検証されない。
  • Sign-Only
    – メッセージは、証明書またはチケットを使用して署名されるが、暗号化はされない。
     これは検証目的のために使用される。
  • Sign and Encrypt
    – メッセージは、証明書またはチケットを使用して署名および暗号化される。
     これはコンテンツの機密性のために使用される。
  • Sign, Encrypt, Encrypt Signature
    – メッセージは、証明書またはチケット使用して署名および暗号化され、
     その証明書またはチケットも暗号化される。
     これはアイデンティティとコンテンツの機密性のために使用される。

次に進めると、Server Certificate (サーバー証明書) を選択する画面になります。

ここで選択できるのは、ローカルマシンアカウントの個人用ストアからの証明書だけです。
つまり、プライベートキーを持っている証明書になります。

最後に確認画面になり、終了です。

以上でポリシーファイルの作成終了です。
次に、このポリシーファイルを使用するように サービスクラスに Policy 属性を加えましょう。
[WebService(Namespace = “http://localhost/WSSecurityAnonymous2”)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[Policy(“ServerPolicy”)]
public class WSSecurityAnonymousService2 : System.Web.Services.WebService {
    public Service () {
    }

    [WebMethod]
    public string HelloWorld() {
        return “Hello World”;
    }
}

なお、Policy 属性で指定する名前は、(*1) で使用したものになるので注意してください。

これで WSSecurityAnonymousService2 クラスは、Web クライアントとの間で、すべての通信が
セキュアで暗号化されるようになりました。また、承認は必要されません。
それでは、同じように Web クライアントを作成しましょう。
似たような方法ですので、ポイントだけ記載します。

  1. Authentication Settings (認証の設定)
    Secure a client application を選択する
    クライアントの認証方式は Anonymous を選択する
  2. Message Protection (メッセージ保護)
    Sign and Encrypt を選択する
  3. Server Certificate (サーバー証明書)
    カレントユーザーの他の人ストアからの証明書を使う(パブリックキー証明書)

なお、Web クライアント側でポリシーファイルを設定するには、SetPolicy メソッドを使います。
WSSecurityAnonymousServiceWse2 serviceProxy = new WSSecurityAnonymousServiceWse2();
ConfigureProxy(serviceProxy);
serviceProxy.SetPolicy(“ClientPolicy”);
SetPolicy メソッドでは、ポリシーの名前を指定します。

結構、簡単にできますね。
基本的な方法なので、ぜひ、覚えておきましょう。覚えておいて、損はありません。

WSE の事を書いたら、やっぱり、WCF も書かないと話しが閉じませんね。
WCF については、またの機会に。