方法 : 署名および暗号化に個別の X.509 証明書を使用する
ここでは、クライアントとサービスの両方においてメッセージの署名と暗号化とで別の証明書を使用するように Windows Communication Foundation (WCF) を構成する方法を示します。
WCF では複数のクライアント証明書またはサービス証明書を設定する API が提供されていないため、署名と暗号化で別の証明書を使用できるようにするには、カスタム クライアント資格情報またはカスタム サービス資格情報 (あるいはその両方) を作成する必要があります。さらに、複数の証明書の情報を利用し、指定されたキーの使用方法やメッセージの方向について適切なセキュリティ トークン プロバイダを作成するために、セキュリティ トークン マネージャを用意する必要があります。
使用される主要なクラス、そのクラスの継承元のクラス (上向きの矢印で表示)、および特定のメソッドおよびプロパティの戻り値の型を次の図に示します。
- MyClientCredentials は、ClientCredentials のカスタム実装です。
- 図に示されたすべてのプロパティは、すべて X509Certificate2 のインスタンスを返します。
- メソッド CreateSecurityTokenManager は、MyClientCredentialsSecurityTokenManager のインスタンスを返します。
- MyClientCredentialsSecurityTokenManager は、ClientCredentialsSecurityTokenManager のカスタム実装です。
- メソッド CreateSecurityTokenProvider は、X509SecurityTokenProvider のインスタンスを返します。
カスタム資格情報詳細については、 、「方法 : カスタム クライアントおよびサービスの資格情報を作成する」を参照してください。
また、カスタム ID 検証機能を作成し、カスタム バインディングのセキュリティ バインディング要素にリンクする必要があります。さらに、既定の資格情報の代わりにカスタム資格情報を使用する必要があります。
カスタム バインディングに関連したクラス、およびカスタム ID 検証機能のリンク方法を次の図に示します。関連するバインディング要素はいくつかありますが、そのすべてが BindingElement から継承されています。AsymmetricSecurityBindingElement には、LocalClientSecuritySettings プロパティがあります。このプロパティは、MyIdentityVerifier のカスタマイズの元となる IdentityVerifier のインスタンスを返します。
カスタム ID 検証機能詳細については、 、「方法 : カスタム クライアント ID 検証機能を作成する」を参照してください。
署名と暗号化に別個の証明書を使用するには
ClientCredentials クラスを継承する新しいクライアント資格情報クラスを定義します。複数の証明書を指定できるようにする、
ClientSigningCertificate
、ClientEncryptingCertificate
、ServiceSigningCertificate
、およびServiceEncryptingCertificate
の 4 つの新しいプロパティを実装します。また、CreateSecurityTokenManager メソッドをオーバーライドして、次のステップで定義するカスタマイズ済みの ClientCredentialsSecurityTokenManager クラスのインスタンスを返すように設定します。ClientCredentialsSecurityTokenManager クラスを継承する新しいクライアント セキュリティ トークン マネージャを定義します。適切なセキュリティ トークン プロバイダを作成するために、CreateSecurityTokenProvider メソッドをオーバーライドします。メッセージの方向とキーの使用方法は、requirement パラメータ (SecurityTokenRequirement) で提供されます。
ServiceCredentials クラスを継承する新しいサービス資格情報クラスを定義します。複数の証明書を指定できるようにする、
ClientSigningCertificate
、ClientEncryptingCertificate
、ServiceSigningCertificate
、およびServiceEncryptingCertificate
の 4 つの新しいプロパティを実装します。また、CreateSecurityTokenManager メソッドをオーバーライドして、次のステップで定義するカスタマイズ済みの ServiceCredentialsSecurityTokenManager クラスのインスタンスを返すように設定します。ServiceCredentialsSecurityTokenManager クラスを継承する新しいサービス セキュリティ トークン マネージャを定義します。渡されたメッセージの方向とキーの使用方法について適切なセキュリティ トークン プロバイダを作成するために、CreateSecurityTokenProvider メソッドをオーバーライドします。
クライアントで複数の証明書を使用するには
カスタム バインディングの作成セキュリティ バインディング要素は、要求と応答について異なるセキュリティ トークン プロバイダが存在することを可能にする二重モードで動作する必要があります。これを行うには、二重モード対応のトランスポートを使用するか、次のコードで示すように CompositeDuplexBindingElement を使用します。次のステップで定義するカスタマイズ済みの IdentityVerifier をセキュリティ バインディング要素にリンクします。既定のクライアント資格情報を、事前に作成したカスタマイズ済みのクライアント資格情報に置き換えます。
カスタム IdentityVerifier を定義します。要求の暗号化と応答への署名で異なる証明書が使用されるため、サービスには複数の ID があります。
メモ : 次のサンプルで用意されたカスタム ID 検証方法では、デモンストレーション用であるため、エンドポイント ID 検査がまったく行われません。これは製品版のコードでは、お勧めしません。
サービスで複数の証明書を使用するには
- カスタム バインディングの作成セキュリティ バインディング要素は、要求と応答について異なるセキュリティ トークン プロバイダが存在することを可能にする二重モードで動作する必要があります。クライアントの場合と同様に、二重モード対応のトランスポートを使用するか、次のコードで示すように CompositeDuplexBindingElement を使用します。既定のサービス資格情報を、事前に作成したカスタマイズ済みのサービス資格情報に置き換えます。
関連項目
リファレンス
ClientCredentials
ServiceCredentials
ClientCredentialsSecurityTokenManager
ServiceCredentialsSecurityTokenManager
IdentityVerifier