3

2 つの WCF サーバーがあり、両方ともドメイン mydomain.com (架空の例、以下の IP と同じです!) に、それぞれ server1 と server2 という名前が付けられています。

どちらもパブリック IP アドレス (foo.1 および 2) を介してアクセスできますが、プライベート LAN (つまり、192.168.0.1 および 192.168.0.2) からもアクセスできます。

*.mydomain.com のワイルドカード SSL 証明書を所有しています。関連するストアに正しくインストールされている (つまり、暗号化用の Personal と認証用の Trusted Clients)。

認証目的でワイルドカード証明書を使用して、両方のサーバーをローカル ネットワーク アドレスで相互に接続したいと考えています。

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」を提供しました。これが正当なリモート エンドポイントである場合は、チャネル プロキシの作成時に EndpointAddress の Identity プロパティとして DNS ID 'mydomain.com' を明示的に指定することで問題を解決できます。

サーバーが mydomain.com だけでなく Server2.mydomain.com に応答するように試みましたが、成功しませんでした。これを行う方法に関するヒントはありますか?

エラーメッセージで提案されている解決策も試しましたが、これはまったく効果がないようです (他のユーザーも同じ問題を抱えているようで、まだ解決策を見つけていません)。これを修正する方法について何か考えはありますか?

編集:X509認証に実際に使用できることを証明書プロバイダーに確認しました。

4

2 に答える 2

1

私の Identity フィールドが無視されている理由がようやくわかりました。

私のエンドポイントは次のように構築されました:

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 );
于 2009-10-28T15:55:43.393 に答える
0

エラーが話しているDNSクレームオーバーライドは、サーバーではなくクライアント側で指定されると思うので、クライアントがドメイン内の任意のサーバーに正常に接続できることを除いて、その変更を加えても何も開かれていません(聞いていた)。表示されているエラーは、証明書のホスト名の不一致に相当するメッセージ セキュリティのようなものです。いろいろいじった後、ワイルドカード証明書でメッセージセキュリティが機能するようになりましたが、証明書にクライアント認証の使用法が指定されていない可能性があるため、カスタム検証作業を行う必要があるかもしれません。

トランスポート セキュリティを使用していない理由はありますか? 中間のレイヤー7ルーティングがない限り、作業がはるかに簡単です...

于 2009-10-28T01:53:00.163 に答える