クライアントとサーバー間の通信を暗号化するために証明書を使用するWCFアプリケーションを作成しています。開発環境では、makecertを使用して作成したテスト証明書/自己署名証明書を使用したいと思います。 (サーバーのみが証明書を持ち、クライアントは持っていません)。
証明書を証明書ストアにインストールしましたが、すべて正常に機能しています。クライアントでは、テスト証明書を使用しているため、certificateValidationModeは現在「false」に設定されています。
私の問題:
クライアントのapp.configで、次のようにID要素を指定する必要があります。
<endpoint ... >
<identity>
<dns value="<Name-Of-Server-Computer>"/>
</identity>
</endpoint>
ID要素を削除すると、サーバーに接続しようとすると、クライアントに次のエラーメッセージが表示されます。
送信メッセージのIDチェックに失敗しました。リモートエンドポイントの予想されるDNSIDは「localhost」でしたが、リモートエンドポイントはDNSクレーム「Name-Of-Server-Computer」を提供しました。これが正当なリモートエンドポイントである場合は、チャネルプロキシを作成するときに、EndpointAddressのIdentityプロパティとしてDNS ID'Name-Of-Server-Computer 'を明示的に指定することで問題を修正できます。
だからここに私の質問があります:
IDチェックは、テスト/自己署名証明書を使用する場合にのみ実行されますか? CAから購入した実際の信頼できる証明書を使用してアプリケーションをデプロイする場合、IDチェックは引き続き行われますか?
IDチェックを無効にする方法はありますか?独自のカスタム証明書バリデーターを作成できることは知っていますが、これらを使用してIDチェックをオーバーライドする方法はないようです。
チェックは常に行われます-そしてそうあるべきです。基本的に、WCFは、証明書がドメイン名(yourcompany.com)またはサービスが存在するマシン名に発行されていることを確認します。これは私が決して無効にしないセキュリティチェックです!そうしないと、サービスをスプーフィングする人が、任意のドメイン/マシン名で作成された証明書を使用して、トラフィックを取得する可能性があります。
したがって、確認する必要があるのは、本番サーバー上の実際の証明書が、本番サーバーが含まれるドメイン名に対して実際に発行されていることです。本番サーバーを「production.yourcompany.com」に配置する場合は、そのドメインに対して証明書を作成する必要があります。
マーク
この質問に対する答えは、エラーメッセージ自体にあります。クライアントでできること:
EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);
「サーバー」を予想されるものに置き換えます。通常、これは自己署名証明書の共通名(CN)になります。提示された証明書が有効であることを確認するすべての責任を負う場合、つまりカスタム証明書バリデーターを作成し、そこで関連するチェックを行う場合は、セキュリティを損なうことはありません。
certificateValidationModeは、「false」ではなく「None」に設定する必要があります。