カスタム バインディング セキュリティ
このサンプルでは、カスタム バインディングを使用してセキュリティを構成する方法を示します。カスタム バインディングを使用して、セキュリティで保護されたトランスポートと共にメッセージ レベルのセキュリティを有効にする方法を示します。これは、クライアントとサービス間でメッセージを転送する際にセキュリティで保護されたトランスポートが必要であると同時に、そのメッセージをメッセージ レベルでセキュリティ保護する必要がある場合に便利です。この構成は、システム指定のバインディングではサポートされていません。
このサンプルは、クライアント コンソール プログラム (EXE) とサービス コンソール プログラム (EXE) で構成されています。サービスは、双方向コントラクトを実装します。このコントラクトは ICalculatorDuplex
インターフェイスによって定義されており、算術演算 (加算、減算、乗算、および 除算) を公開しています。ICalculatorDuplex
インターフェイスを使用することにより、クライアントは算術演算を実行し、セッション経由で実行結果を計算できます。サービスは、ICalculatorDuplexCallback
インターフェイスで結果を個別に返すことができます。コンテキストを確立して、クライアントとサービスの間で送信される一連のメッセージを相互に関連付ける必要があるため、双方向コントラクトにはセッションが必要です。カスタム バインディングは、双方向通信をサポートしてセキュリティで保護されるよう定義されます。
メモ : |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
サービス構成では、次をサポートするカスタム バインディングが定義されます。
TLS/SSL プロトコルを使用して保護される TCP 通信。
Windows メッセージ セキュリティ。
カスタム バインディングの構成により、トランスポートのセキュリティ保護が有効になると同時に、メッセージ レベルのセキュリティも有効になります。カスタム バインディングを定義するうえで、バインディング要素の順序は重要です。各バインディング要素は、チャネル スタック内のレイヤを表すためです (「Custom Bindings」を参照してください)。カスタム バインディングはサービスとクライアントの構成ファイルで定義されます。次のサンプル構成を参照してください。
<bindings>
<!-- Configure a custom binding. -->
<customBinding>
<binding name="Binding1">
<security authenticationMode="SecureConversation"
requireSecurityContextCancellation="true">
</security>
<textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
<sslStreamSecurity requireClientCertificate="false"/>
<tcpTransport/>
</binding>
</customBinding>
</bindings>
カスタム バインディングはサービス証明書を使用して、トランスポート レベルでサービスを認証し、クライアントとサービス間で転送中のメッセージを保護します。これは sslStreamSecurity
バインディング要素によって実現されます。サービスの証明書は、サービス動作を使用して構成されます。次のサンプル構成を参照してください。
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata />
<serviceDebug includeExceptionDetailInFaults="False" />
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
さらに、カスタム バインディングは Windows 資格情報の種類 (既定の資格情報の種類) によるメッセージ セキュリティを使用します。これは security
バインディング要素によって実現されます。Kerberos 認証機構が利用できる場合は、クライアントとサービスはどちらもメッセージ レベルのセキュリティを使用して認証されます。サンプルを Active Directory 環境で実行する場合、この認証が行われます。Kerberos 認証機構が利用できない場合は、NTLM 認証が使用されます。NTLM はサービスに対してクライアントを認証しますが、クライアントに対するサービスの認証は行いません。security
バインディング要素は SecureConversation
とauthenticationType
を使用するように構成されます。この結果、クライアントとサービスの両方でセキュリティ セッションが作成されます。これは、サービスの双方向コントラクトを動作させるために必要です。
このサンプルを実行する場合は、操作要求および応答はクライアントのコンソール ウィンドウに表示されます。クライアントをシャットダウンするには、クライアント ウィンドウで Enter キーを押します。
Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)
サンプルを実行すると、クライアントに戻ってきたメッセージがサービスから送信されたコールバック インターフェイスに表示されます。それぞれの中間結果が表示され、その後にすべての操作が完了したときの数式全体が表示されます。Enter キーを押してクライアントをシャットダウンします。
サンプルに用意されている Setup.bat ファイルを使用すると、適切なサービス証明書を使用してクライアントとサーバーを構成し、証明書ベースのセキュリティを必要とするホスト アプリケーションを実行できるようになります。このバッチ ファイルは、別のコンピュータを使用する場合またはホストなしの場合に応じて変更する必要があります。
次に、このサンプルに適用されるバッチ ファイルのセクションのうち、該当する構成で実行するために変更が必要となる部分を示します。
サーバー証明書の作成。
Setup.bat ファイルの次の行は、使用するサーバー証明書を作成します。
%SERVER_NAME%
変数はサーバー名です。この変数を変更して、使用するサーバー名を指定します。このバッチ ファイルでのサーバー名の既定は localhost です。Web ホスト サービスの場合、証明書は CurrentUser ストアに格納されます。
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
クライアントの信頼された証明書ストアへのサーバー証明書のインストール。
Setup.bat ファイルの次の行は、サーバー証明書をクライアントの信頼されたユーザーのストアにコピーします。この手順が必要なのは、Makecert.exe によって生成される証明書がクライアント システムにより暗黙には信頼されないからです。マイクロソフト発行の証明書など、クライアントの信頼されたルート証明書に基づいた証明書が既にある場合は、クライアント証明書ストアにサーバー証明書を配置するこの手順は不要です。
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
メモ : Setup.bat バッチ ファイルは、Windows SDK コマンド プロンプトから実行します。MSSDK 環境変数が SDK のインストール ディレクトリを指している必要があります。この環境変数は、Windows SDK コマンド プロンプトで自動設定されます。
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
サンプルを単一コンピュータ構成または複数コンピュータ構成で実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。
サンプルを同じコンピュータで実行するには
Makecert.exe が存在するフォルダがパスに含まれていることを確認します。
Setup.bat をサンプルのインストール フォルダで実行します。これにより、サンプルの実行に必要なすべての証明書がインストールされます。
メモ : Setup.bat バッチ ファイルは、Windows SDK コマンド プロンプトから実行します。実行するには、MSSDK 環境変数が SDK のインストール ディレクトリを指している必要があります。この環境変数は、Windows SDK コマンド プロンプトで自動設定されます。
Service.exe を \service\bin で起動します。
Client.exe を \client\bin で起動します。クライアント アクティビティがクライアントのコンソール アプリケーションに表示されます。
クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。
サンプルを別のコンピュータで実行するには
サービス コンピュータ側 :
サービス コンピュータで、servicemodelsamples という仮想ディレクトリを作成します。
サービス プログラム ファイルを \inetpub\wwwroot\servicemodelsamples からサービス コンピュータの仮想ディレクトリにコピーします。ファイルのコピー先が \bin サブディレクトリであることを確認します。
Setup.bat ファイルと Cleanup.bat ファイルをサービス コンピュータにコピーします。
コマンド Setup.bat service を実行します。これにより、バッチ ファイルが実行されたコンピュータの名前と一致するサブジェクト名を持つ、サービス証明書が作成されます。
メモ : Setup.bat バッチ ファイルは、Windows SDK コマンド プロンプトから実行します。実行するには、MSSDK 環境変数が SDK のインストール ディレクトリを指している必要があります。この環境変数は、Windows SDK コマンド プロンプトで自動設定されます。
Service.exe.config ファイル内の serviceCertificate element of serviceCredentialsを変更し、前の手順で生成された証明書のサブジェクト名に反映します。
コマンド プロンプトから Service.exe を起動します。
クライアント コンピュータ側 :
クライアント プログラム ファイルを、\client\bin\ フォルダからクライアント コンピュータにコピーします。Cleanup.bat ファイルもコピーします。
Cleanup.bat を実行して、前のサンプルから古い証明書を削除します。
サービス コンピュータで次のコマンドを実行して、サービスの証明書をエクスポートします (
%SERVER_NAME%
は、サービスが実行されているコンピュータの完全修飾名に置き換えてください)。certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
%SERVER_NAME%.cer をクライアント コンピュータにコピーします (%SERVER_NAME% は、サービスが実行されているコンピュータの完全修飾名に置き換えてください)。
クライアント コンピュータで次のコマンドを実行して、サービスの証明書をインポートします (%SERVER_NAME% は、サービスが実行されているコンピュータの完全修飾名に置き換えてください)。
certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
証明書が信頼できる発行元から発行されている場合は、手順 c.、d.、および e. は不要です。
次のようにクライアントの App.config を変更します。
<client> <endpoint name="default" address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service" binding="customBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" behaviorConfiguration="CalculatorClientBehavior" /> </client>
ドメイン環境でサービスが NetworkService または LocalSystem 以外のアカウントで実行されている場合は、クライアントの App.config ファイル内のサービス エンドポイントのエンドポイント ID を変更し、サービスの実行に使用されているアカウントに基づいて、適切な UPN または SPN を設定する必要がある場合があります。エンドポイント ID の詳細については、「Specifying Service Identity」のトピックを参照してください。
コマンド プロンプトから Client.exe を起動します。
サンプルの実行後にクリーンアップするには
- サンプルの実行が終わったら、サンプル フォルダにある Cleanup.bat を実行します。
Copyright © 2007 by Microsoft Corporation.All rights reserved.