次の方法で共有


ディスカバリー セキュリティ サンプル

探索仕様では、検出プロセスに参加するエンドポイントをセキュリティで保護する必要はありません。 検出メッセージをセキュリティで強化すると、さまざまな種類の攻撃 (メッセージの変更、サービス拒否、再生、スプーフィング) が軽減されます。

DiscoveryScenario サンプルでは、コンパクト署名形式を使用してメッセージ署名を計算および検証するカスタム チャネルを実装します (WS-Discovery 仕様のセクション 8.2 で説明)。 このサンプルでは、 2005 Discovery 仕様1.1 バージョンの両方がサポートされています。

カスタム チャネルは、検出エンドポイントとアナウンス エンドポイントの既存のチャネル スタックの上に適用されます。 これにより、送信されたすべてのメッセージに署名ヘッダーが適用されます。 署名は受信したメッセージで検証され、一致しない場合、またはメッセージに署名がない場合、メッセージは削除されます。 メッセージに署名して確認するために、サンプルでは証明書を使用します。

議論

WCF は拡張可能であり、ユーザーは必要に応じてチャネルをカスタマイズできます。 このサンプルでは、セキュリティで保護されたチャネルを構築するディスカバリーのセキュアバインディング要素を実装します。 セキュリティで保護されたチャネルは、メッセージ署名を適用して検証し、現在のスタックの上に適用されます。

セキュリティで保護されたバインド要素は、セキュリティで保護されたチャネル ファクトリとチャネル リスナーを構築します。

セキュアチャネルファクトリー

セキュリティで保護されたチャネル ファクトリは、メッセージ ヘッダーにコンパクトな署名を追加する出力または双方向チャネルを作成します。 メッセージをできるだけ小さくするには、コンパクト署名形式が使用されます。 コンパクト署名の構造を次の例に示します。

<d:Security ... >
  [<d:Sig Scheme="xs:anyURI"
         [KeyId="xs:base64Binary"]?
          Refs="..."
         [PrefixList]="xs:NMTOKENS"
          Sig="xs:base64Binary"
          ... />]?
  ...
</d:Security>

PrefixListは、2008 年の検出バージョン プロトコルで追加されました。

署名を計算するために、サンプルは展開された署名項目を決定します。 WS-Discovery 仕様で必要に応じて、SignedInfo名前空間プレフィックスを使用して XML シグネチャ (ds) が作成されます。 検出およびアドレス指定名前空間の本文とすべてのヘッダーは署名で参照されるため、改ざんできません。 参照される各要素は排他正規化 (http://www.w3.org/2001/10/xml-exc-c14n#) を使用して変換され、SHA-1 ダイジェスト値が計算されます (http://www.w3.org/2000/09/xmldsig#sha1)。 参照されるすべての要素とそのダイジェスト値に基づいて、署名値は RSA アルゴリズム (http://www.w3.org/2000/09/xmldsig#rsa-sha1) を使用して計算されます。

メッセージは、クライアント指定の証明書で署名されます。 バインディング要素の作成時に、ストアの場所、名前、証明書のサブジェクト名を指定する必要があります。 コンパクト署名の KeyId は、署名トークンのキー識別子を表し、署名トークンのサブジェクト キー識別子 (SKI) または (SKI が存在しない場合) 署名トークンの公開キーの SHA-1 ハッシュです。

セキュリティで保護されたチャネル リスナー

セキュア チャネル リスナーは、受信したメッセージのコンパクト署名を検証する入力チャネルまたは双方向チャネルを作成します。 署名を確認するために、メッセージに添付されたコンパクト署名で指定された KeyId を使用して、指定したストアから証明書を選択します。 メッセージに署名がない場合、または署名チェックが失敗した場合、メッセージは削除されます。 このサンプルでは、セキュリティで保護されたバインドを使用するために、追加された探索のセキュリティで保護されたバインド要素を使用してカスタム UdpDiscoveryEndpointUdpAnnouncementEndpoint を作成するファクトリを定義します。 これらのセキュリティで保護されたエンドポイントは、探索アナウンス リスナーと探索可能なサービスで使用できます。

サンプルの詳細

このサンプルには、ライブラリと 4 つのコンソール アプリケーションが含まれています。

  • DiscoverySecurityChannels: セキュリティで保護されたバインディングを公開するライブラリ。 ライブラリは、送信/受信メッセージのコンパクト署名を計算して検証します。

  • サービス: 自己ホスト型の ICalculatorService コントラクトを公開するサービス。 サービスは Discoverable としてマークされます。 ユーザーは、ストアの場所と名前、証明書のサブジェクト名またはその他の一意識別子、およびクライアント証明書が存在するストア (受信メッセージの署名の確認に使用される証明書) を指定して、メッセージの署名に使用される証明書の詳細を指定します。 これらの詳細に基づいて、セキュリティが強化された UdpDiscoveryEndpoint が構築され、使用されます。

  • クライアント: このクラスは、ICalculatorService を検出し、サービスでメソッドを呼び出そうとします。 ここでも、セキュリティが強化された UdpDiscoveryEndpoint が構築され、メッセージの署名と検証に使用されます。

  • AnnouncementListener: オンラインとオフラインのお知らせをリッスンし、セキュリティで保護されたアナウンス エンドポイントを使用するセルフホステッド サービス。

Setup.bat が複数回実行される場合、証明書マネージャーは、重複する証明書があるため、追加する証明書の選択を求められます。 その場合は、重複が既に作成されているため、Setup.bat を中止し、Cleanup.bat を呼び出す必要があります。 Cleanup.bat、削除する証明書の選択を求めるメッセージも表示されます。 一覧から証明書を選択し、証明書が残らなくなるまで Cleanup.bat の実行を続行します。

このサンプルを使用するには

  1. Visual Studio の開発者コマンド プロンプトから Setup.bat スクリプトを実行します。 このサンプルでは、証明書を使用してメッセージの署名と検証を行います。 スクリプトは、Makecert.exe を使用して証明書を作成し、Certmgr.exeを使用して証明書をインストールします。 スクリプトは管理者特権で実行する必要があります。

  2. サンプルをビルドして実行するには、Visual Studio で Security.sln ファイルを開き、[ すべてリビルド] を選択します。 ソリューションのプロパティを更新して、複数のプロジェクトを開始します。DiscoverySecureChannels を除くすべてのプロジェクトで [開始 ] を選択します。 ソリューションを正常に実行します。

  3. サンプルが完了したら、このサンプル用に作成された証明書を削除する Cleanup.bat スクリプトを実行します。