次の方法で共有


メッセージ セキュリティ匿名

Message Security Anonymous サンプルは、クライアント認証なしでメッセージ レベルのセキュリティを使用するが、サーバーの X.509 証明書を使用したサーバー認証を必要とする Windows Communication Foundation (WCF) アプリケーションを実装する方法を示しています。 クライアントとサーバーの間のすべてのアプリケーション メッセージは署名され、暗号化されます。 このサンプルは、 WSHttpBinding サンプルに 基づいています。 このサンプルは、インターネット インフォメーション サービス (IIS) によってホストされるクライアント コンソール プログラム (.exe) とサービス ライブラリ (.dll) で構成されています。 このサービスは、要求/応答通信パターンを定義するコントラクトを実装します。

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

このサンプルでは、クライアントが認証されなかった場合に True を返す新しい操作を電卓インターフェイスに追加します。

public class CalculatorService : ICalculator
{
    public bool IsCallerAnonymous()
    {
        // ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
        return ServiceSecurityContext.Current.IsAnonymous;
    }
    ...
}

サービスは、構成ファイル (Web.config) を使用して定義された、サービスと通信するための単一のエンドポイントを公開します。 エンドポイントは、アドレス、バインディング、およびコントラクトで構成されます。 バインドは、 wsHttpBinding バインドで構成されます。 wsHttpBinding バインディングの既定のセキュリティ モードはMessageclientCredentialType属性は None に設定されます。

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
     <!-- This configuration defines the security mode as Message and -->
     <!-- the clientCredentialType as None. This mode provides -->
     <!-- server authentication only using the service certificate. -->

     <binding>
       <security mode="Message">
         <message clientCredentialType="None" />
       </security>
     </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

サービス認証に使用する資格情報は、<behavior>で指定されます。 サーバー証明書には、次のサンプル コードに示すように、findValue属性に指定された値と同じSubjectNameの値が含まれている必要があります。

<behaviors>
  <serviceBehaviors>
    <behavior>
      <!--
    The serviceCredentials behavior allows you to define a service certificate.
    A service certificate is used by a client to authenticate the service and provide message protection.
    This configuration references the "localhost" certificate installed during the setup instructions.
    -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
      </serviceCredentials>
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

クライアント エンドポイントの構成は、サービス エンドポイント、バインディング、コントラクトの絶対アドレスで構成されます。 wsHttpBinding バインディングのクライアント セキュリティ モードがMessageclientCredentialType属性は None に設定されます。

<system.serviceModel>
  <client>
    <endpoint name=""
             address="http://localhost/servicemodelsamples/service.svc"
             binding="wsHttpBinding"
             behaviorConfiguration="ClientCredentialsBehavior"
             bindingConfiguration="Binding1"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </client>

  <bindings>
    <wsHttpBinding>
      <!--This configuration defines the security mode as -->
      <!--Message and the clientCredentialType as None. -->
      <binding name="Binding1">
        <security mode = "Message">
          <message clientCredentialType="None"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

このサンプルでは、サービスの証明書を認証するためのPeerOrChainTrustCertificateValidationModeを設定します。 これは、クライアントの App.config ファイルの behaviors セクションで行われます。 これは、証明書がユーザーの信頼できるユーザー ストアにある場合、証明書の発行者チェーンの検証を実行せずに信頼されることを意味します。 この設定は、証明機関 (CA) によって発行された証明書を必要とせずにサンプルを実行できるように、便宜上ここで使用します。 この設定は、既定の ChainTrust よりも安全性が低くなります。 運用環境のコードで PeerOrChainTrust を使用する前に、この設定のセキュリティへの影響を慎重に検討する必要があります。

クライアント実装は、 IsCallerAnonymous メソッドへの呼び出しを追加します。それ以外の場合は 、WSHttpBinding サンプルと異なります。

// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

...

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

サンプルを実行すると、操作要求と応答がクライアント コンソール ウィンドウに表示されます。 クライアント ウィンドウで Enter キーを押して、クライアントをシャットダウンします。

IsCallerAnonymous returned: True
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Message Security Anonymous サンプルに含まれている Setup.bat バッチ ファイルを使用すると、証明書ベースのセキュリティを必要とするホストされたアプリケーションを実行するための関連証明書を使用してサーバーを構成できます。 バッチ ファイルは、2 つのモードで実行できます。 単一コンピューター モードでバッチ ファイルを実行するには、コマンド ラインで「 setup.bat 」と入力します。 サービス モードで実行するには、「 setup.bat service」と入力します。 このモードは、複数のコンピューターでサンプルを実行する場合に使用します。 詳細については、このトピックの最後にあるセットアップ手順を参照してください。

バッチ ファイルのさまざまなセクションの概要を次に示します。

  • サーバー証明書の作成。

    Setup.bat バッチ ファイルの次の行は、使用するサーバー証明書を作成します。

    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
    

    %SERVER_NAME% 変数は、サーバー名を指定します。 証明書は LocalMachine ストアに格納されます。 セットアップ バッチ ファイルが service の引数 ( setup.bat service など) を使用して実行される場合、%SERVER_NAME% にはコンピューターの完全修飾ドメイン名が含まれます。 それ以外の場合は、既定で localhost になります。

  • クライアントの信頼された証明書ストアへのサーバー証明書のインストール。

    次の行は、サーバー証明書をクライアントの信頼されたユーザー ストアにコピーします。 Makecert.exe によって生成された証明書はクライアント システムによって暗黙的に信頼されないため、この手順が必要です。 クライアントの信頼されたルート証明書 (Microsoft が発行した証明書など) にルート化された証明書が既にある場合、クライアント証明書ストアにサーバー証明書を設定するこの手順は必要ありません。

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • 証明書の秘密キーに対するアクセス許可の付与。

    Setup.bat バッチ ファイルの次の行は、localMachine ストアに格納されているサーバー証明書を、ASP.NET ワーカー プロセス アカウントからアクセスできるようにします。

    echo ************
    echo setting privileges on server certificates
    echo ************
    for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R
    iisreset
    

米国以外のユーザーを使用している場合Windows の英語版では、Setup.bat ファイルを編集し、 NT AUTHORITY\NETWORK SERVICE アカウント名を地域に相当する名前に置き換える必要があります。

サンプルを設定、ビルド、実行するには

  1. Windows Communication Foundation サンプル One-Time セットアップ手順を実行していることを確認します。

  2. ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

同じコンピューターでサンプルを実行するには

  1. パスに、Makecert.exe と FindPrivateKey.exe が配置されているフォルダーが含まれていることを確認します。

  2. 管理者特権で実行した Visual Studio の開発者コマンド プロンプトで、サンプルのインストール フォルダーから Setup.bat を実行します。 これにより、サンプルの実行に必要なすべての証明書がインストールされます。

    セットアップ バッチ ファイルは、Visual Studio の開発者コマンド プロンプトから実行するように設計されています。 パス環境変数が SDK がインストールされているディレクトリを指している必要があります。 この環境変数は、Visual Studio の開発者コマンド プロンプト内で自動的に設定されます。

  3. http://localhost/servicemodelsamples/service.svcアドレスを入力して、ブラウザーを使用してサービスへのアクセスを確認します。

  4. \client\bin から Client.exe を起動します。 クライアント アクティビティがクライアント コンソール アプリケーションに表示されます。

  5. クライアントとサービスが通信できない場合は、「WCF サンプルのトラブルシューティングのヒント」を参照してください。

複数のコンピューターでサンプルを実行するには

  1. サービス コンピューター上にディレクトリを作成します。 インターネット インフォメーション サービス (IIS) 管理ツールを使用して、このディレクトリの servicemodelsamples という名前の仮想アプリケーションを作成します。

  2. サービス プログラム ファイルを \inetpub\wwwroot\servicemodelsamples からサービス コンピューター上の仮想ディレクトリにコピーします。 \bin サブディレクトリ内のファイルをコピーしてください。 また、Setup.bat ファイルと Cleanup.bat ファイルをサービス コンピューターにコピーします。

  3. クライアント コンピューター上にクライアント バイナリ用のディレクトリを作成します。

  4. クライアント プログラム ファイルをクライアント コンピューター上のクライアント ディレクトリにコピーします。 また、Setup.bat、Cleanup.bat、および ImportServiceCert.bat ファイルをクライアントにコピーします。

  5. サーバーで、管理者特権で開かれた Visual Studio の開発者コマンド プロンプトで setup.bat service を実行します。 setup.bat 引数を指定して service を実行すると、コンピューターの完全修飾ドメイン名を持つサービス証明書が作成され、サービス証明書が Service.cer という名前のファイルにエクスポートされます。

  6. Web.config を編集して、新しい証明書名 (findValue の < 属性) を反映させます。これは、コンピューターの完全修飾ドメイン名と同じです。

  7. Service.cer ファイルをサービス ディレクトリからクライアント コンピューター上のクライアント ディレクトリにコピーします。

  8. クライアント コンピューター上の Client.exe.config ファイルで、サービスの新しいアドレスと一致するようにエンドポイントのアドレス値を変更します。

  9. クライアントで、管理者特権で開かれた Visual Studio の開発者コマンド プロンプトで ImportServiceCert.bat を実行します。 これにより、Service.cer ファイルから CurrentUser - TrustedPeople ストアにサービス証明書がインポートされます。

  10. クライアント コンピューターで、コマンド プロンプトから Client.exe を起動します。 クライアントとサービスが通信できない場合は、「WCF サンプルのトラブルシューティングのヒント」を参照してください。

サンプルの実行後にクリーンアップするには

  • サンプルの実行が完了したら、samples フォルダーで Cleanup.bat を実行します。

このスクリプトは、コンピューター間でこのサンプルを実行するときに、クライアント上のサービス証明書を削除しません。 コンピューター間で証明書を使用する Windows Communication Foundation (WCF) サンプルを実行している場合は、CurrentUser - TrustedPeople ストアにインストールされているサービス証明書を必ずクリアしてください。 これを行うには、次のコマンドを使用します。 certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> 例: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.