私は、SecurityMode.Messageを使用して通信を暗号化するいくつかのWCFサービスを開始するアプリケーションを開発しました。WCF認証用SSL証明書
SSL証明書を生成して特定のストア、サーバー、およびクライアントに置く必要があるため、動作はしていますが、非常に複雑です。
問題は、プログラムを使用する顧客ということです:
- は(実際には、サーバは確かにドメインになりますが、クライアント
- がいないいないドメインにありません
だから私の最高のショットを何であるか?私はデータのみを暗号化するために必要な証明書を購入したい、私は私が右のホストに接続していていることを確認する必要はありません。
を私は」知っています〜でない最良のケースですが、アプリケーションは一部の特定のユーザーによって使用されます。ここで
は、接続を行う私のコードの一部です:
サーバー側:
ServiceHost host = new ServiceHost(typeof(MyServiceType))
WSHttpBinding binding = new WSHttpBinding
{
ReaderQuotas = { MaxStringContentLength = int.MaxValue, MaxArrayLength = int.MaxValue, MaxDepth = int.MaxValue, MaxBytesPerRead = int.MaxValue, MaxNameTableCharCount = int.MaxValue },
MaxReceivedMessageSize = int.MaxValue
};
TimeSpan timeoutSpan = TimeSpan.FromMilliseconds(timeout);
binding.CloseTimeout = timeoutSpan;
binding.OpenTimeout = timeoutSpan;
binding.ReceiveTimeout = timeoutSpan;
binding.SendTimeout = timeoutSpan;
binding.ReliableSession.InactivityTimeout = timeoutSpan;
binding.MaxBufferPoolSize = int.MaxValue;
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, ConfigurationManager.AppSettings["Hostname"]);
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
host
.AddServiceEndpoint(services[port], binding, String.Format("http://localhost:{0}", port));
クライアント側:
string remoteAddress = String.Format("{0}://{1}:{2}", Tools.GetDescription(accessInfo.ServiceHost.Protocol), accessInfo.ServiceHost.HostName, accessInfo.PortNumber);
// avoid seralization/deserialization problems with large XML's
WSHttpBinding binding = new WSHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.ReaderQuotas.MaxDepth = int.MaxValue;
binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
TimeSpan timeoutSpan = DateTime.Now.AddMinutes(30) - DateTime.Now;
binding.CloseTimeout = timeoutSpan;
binding.OpenTimeout = timeoutSpan;
binding.ReceiveTimeout = timeoutSpan;
binding.SendTimeout = timeoutSpan;
binding.ReliableSession.InactivityTimeout = timeoutSpan;
binding.MaxBufferPoolSize = int.MaxValue;
//we set the security type
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
ChannelFactory<TService> channelFactory = new ChannelFactory<TService>(binding, remoteAddress);
_service = channelFactory.CreateChannel();
私が削除したことに注意してください私のカスタム認証に関して、よりクリーンなコードを持つ部分
これは私が考えていたものです。顧客が暗号化を必要とせず、証明書をインストール/支払う必要がない場合(私は彼に推薦する解決策ではありませんが、私は知る必要があります) :私はここにチェックしてもらえますか?私はいくつかの証明書はhttpだけで動作すると思いますか? – J4N
SSLサーバー証明書が機能します。独自のカスタムソリューションを作成したい場合は、それはあなた次第です。それを渡す前にメッセージコンテンツを暗号化し、受け取った後に復号化する必要があります。おそらく、カスタムメッセージインスペクタまたはカスタムチャネル/エンコーダがそれを行います。暗号化のために鍵を安全に保管する方法を見つけなければなりません(これはまさに証明書と同じです)。 –
もう1つ懸念していただきありがとうございます。サーバーがカスタマーネットワークでのみアクセスできる場合はどうなりますか?私は信じられた出版社のために?内部ネットワーク名またはプライベートIPの正当なSSL証明書を取得できますか? – J4N