0

実験室環境では、 ABCの3 つの「アプリケーション」があります。

BCは、WCF チャット サービスをホストします。Aはただのクライアントです。

アプリケーションはBでホストされている WCF サービスを認識し、Bは C でホストさいる WCF サービスを認識します。したがって、アプリケーションはメッセージをCに直接送信できません。

X509証明書で保護されたメッセージセキュリティでnetTcpBindingを使用しています。 アプリはBC証明書を知っています。

Bアプリのチャット サービスのプロキシを作成し、メッセージをCアプリにルーティングするようにBに指示するマークを付けてメッセージを送信したいと考えています。また、メッセージをC証明書でエンコードしたいので、 BはCに指定されたメッセージを読み取ることができません。

この問題は、多くのひどい方法で解決できます。私は WCF に少し慣れていないので、より良い解決策を見つけるために助けが必要です。

この問題を解決するためのより良いアプローチを提案できますか?

ありがとうございました!

4

1 に答える 1

0

追加の質問があります。メッセージ本文をエンコードする方法は?

クライアント側では、このコードを使用します

NetTcpBinding binding = new NetTcpBinding { Security = { Mode = SecurityMode.Message } };
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;

//_foreignServiceCertificate - is the B certificate
//_foreignServiceUrl - is the url of the B service
var endpointIdentity =  EndpointIdentity.CreateDnsIdentity(_foreignServiceCertificate.SubjectName.GetCommonName());
var endPointAddress = new EndpointAddress(new Uri(_foreignServiceUrl), endpointIdentity);

//_thisPeerCertificate - is the A certificate
var channelFactory = new ChannelFactory<IChatService>(binding, endPointAddress);
channelFactory.Credentials.ClientCertificate.Certificate = _thisPeerCertificate;
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
channelFactory.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new ClientCertificateValidation(_foreignServiceCertificate);
IChatService serviceProxy = channelFactory.CreateChannel();

var chatMessage = new ChatMessage { Message = message, MessageSender = _thisPeerCertificate };

serviceProxy.SendMessage(chatMessage);

メッセージ本文をC公開鍵で暗号化することをお勧めします。メッセージ本文は、 B公開鍵を使用して wcf インフラストラクチャによってさらに暗号化されます。私はそれを正しく理解しましたか?

IEndPointBehavior のカスタム実装と IClientMessageInspector (メソッド beforesendrequest) のカスタム実装でメッセージ本文をエンコードできるのは正しいですか?

于 2013-11-01T15:07:18.283 に答える