sslワイルドカード証明書を使用して、X509を介して複数のWCFサーバーを相互認証するにはどうすればよいですか?
-
06-07-2019 - |
質問
ドメインmydomain.com(以下のIPなどの架空の例!)に、それぞれserver1およびserver2という名前の2つのWCFサーバーがあります
どちらもパブリックIPアドレス(foo.1と2)を介してアクセスできますが、プライベートLAN(192.168.0.1と192.168.0.2)からもアクセスできます
*。mydomain.comのワイルドカードSSL証明書を所有しています。関連するストアに正しくインストールされています(暗号化の場合は個人用、認証の場合は信頼できるクライアント)
認証のためにワイルドカード証明書を使用して、両方のサーバーがローカルネットワークアドレスで互いに接続するようにします。
C:\ Windows \ System32 \ drivers \ etc \ hostsファイルを次のように更新しました:
192.168.0.1 Server1.mydomain.com
192.186.0.2 Server2.mydomain.com
Server1.mydomain.comを解決した場合に取得するIPアドレスではありません(foo.1-2を取得したい)
また、IPV4ローカルインターフェイスの接続固有のDNSサフィックスを" mydomain.com"に編集しました
Server.configファイルでこのように証明書が参照されています(認証に関係のない部分をすべて削除しました)
<behavior name="ServerToServerBehavior" >
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
</clientCertificate>
<serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="myServerAsClientBehaviorConfiguration">
<clientCredentials>
<clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
これは、ローカルで生成されたX509証明書を使用する自分の開発用コンピューターでは完全に機能しますが、実稼働環境では次のようになります:
Server.Connect:接続に失敗しました サーバーServer2: System.ServiceModel.Security.MessageSecurityException: 発信のIDチェックが失敗しました メッセージ。予想されるDNS ID リモートエンドポイントは 「server2.mydomain.com」がリモート エンドポイントがDNSクレームを提供 「mydomain.com」。これが 正当なリモートエンドポイント、 明示的に問題を修正する DNS ID「mydomain.com」を指定する のIdentityプロパティとして チャネル作成時のEndpointAddress プロキシ。
サーバーに、mydomain.comだけでなくServer2.mydomain.comに応答させようとしましたが、成功しませんでした。これを行う方法に関するヒントはありますか?
エラーメッセージで提案された解決策も試しましたが、これはまったく効果がないようです(他のユーザーは同じ問題、まだ解決策が見つかりません)。これを修正する方法はありますか?
編集: X509認証に実際に使用できることを証明書プロバイダーに確認しました。
解決
最終的に、[ID]フィールドが無視された理由を理解しました。
私のエンドポイントは次のように構築されました:
DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");
uriパラメーターが提供されると、DNS IDフィールド(app.configで定義)もオーバーライドされます(空であっても、実際のURIオブジェクトの代わりに文字列を使用する場合)。
解決策は、次のコードを使用してプログラムで設定することです:
System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);
DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );
他のヒント
エラーについて話しているDNSクレームオーバーライドは、サーバーではなくクライアント側で指定されると思うので、クライアントがあなたのサーバーに正常に接続できることを除いて、その変更を行っても何も開きませんドメイン(リッスンしている場合)。表示されているエラーは、証明書のホスト名の不一致に相当するメッセージセキュリティのようなものです。多くの手間をかけた後、ワイルドカード証明書で動作するようにメッセージセキュリティを取得しましたが、証明書にはおそらくクライアント認証の使用法が指定されていないため、カスタム検証作業が必要になる場合があります。
トランスポートセキュリティを使用しない理由は何ですか?中間のLayer7ルーティングがない限り、非常に簡単に機能します...