Web サービス (WCF) と、この Web サービスを使用する Web クライアントを実装する一般的なユース ケースがあります。クライアントとサービスの両方が、署名付きおよび暗号化されたメッセージを送受信しています (メッセージ レベル セキュリティ)。
サービスを使用している複数のクライアントを持つことができるため、サービス プロジェクトが実行されているサーバーに複数のクライアント証明書をインストールする必要があります。
個人および信頼されたルート証明機関の下のローカル マシン ストアに 2 つの証明書 (サービス証明書とクライアント証明書) をインストールしました。
makecert -sr LocalMachine -ss My -a sha1 -n "CN=WCFServer" -len 2048 -sky exchange -pe
makecert -sr LocalMachine -ss My -a sha1 -n "CN=WCFClient" -len 2048 -sky exchange -pe
証明書で「ライセンスの整合性を保証できません」というエラーが表示されますが、今はこの問題は気にしません。
Web クライアントは、独自の秘密鍵を使用して要求メッセージに署名し、サービス証明書の公開鍵を使用してメッセージを暗号化する必要があります。
サービスはリクエストを受け取り、クライアントの公開鍵を介してメッセージの署名を検証し、独自の秘密鍵を介してコンテンツを復号化します
リクエストを処理し、レスポンス オブジェクトを作成します。サービスは、独自の秘密鍵で応答に署名し、クライアントの公開鍵でメッセージを暗号化する必要があります。
これで、クライアントは署名済みおよび暗号化された応答を取得します。ここで、サービスの公開鍵を使用して応答を検証し、独自の秘密鍵でメッセージを復号化します。
これがセネリオ全体です。ローカル開発マシンに (クライアントとサービス) X.509 証明書の両方をインストールしました。私は使用してwsHttpBinding
おり、通信は正常に機能しています。
私は[ServiceContract(ProtectionLevel=ProtectionLevel.EncryptAndSign)]
ServuceContractと[OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign, IsOneWay = false)]
OperationContractに使用しています。
次の質問があります。コードで要求または応答メッセージに署名して暗号化/復号化する必要がありますか (クライアントで 1 回、サービス コードで 1 回)、またはサービス プロジェクトとクライアント プロジェクトの web.config の構成で十分です。 ?
私は次のコードプロジェクトを実行し、正常に動作しています。 http://www.codeproject.com/Articles/36683/simple-steps-to-enable-X-certificates-on-WCF
私のソース コード (Visual Studio プロジェクト) 両方の証明書を含むものは、Bitbucket でダウンロードできます。
誰でも教えてもらえますか、このすべてをコードで行う必要がありますか、それとも現在の構成で行う必要がありますか。
前もって感謝します。