2011-08-12 20 views
1

私は、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(); 

私が削除したことに注意してください私のカスタム認証に関して、よりクリーンなコードを持つ部分

答えて

4

あなたの顧客は窓の外でセキュリティを求めています。domain =あなたの顧客は証明書を求めています。証明書なし=セキュリティなし。それはあなたの顧客に説明しなければならないものです。

サーバー上の秘密鍵で証明書を取得するだけで、クライアントはその証明書を信頼する必要があります(パブリッシャーを信頼する場合はインストールする必要はありません)。どういう意味ですか?次の3つのオプションがあります。

  • 信頼された発行元から証明書を購入する必要がありますし、あなたのクライアントは単に
  • はあなたの顧客は、独自の認証局が証明書を生成し、クライアントが権限の証明書を持っている必要がインストールされている必要があります動作しますあなたの顧客(すべての大企業には独自の認証局があります)。
  • プロダクションで自己署名証明書を使用します。これは「安全性が低い」ものであり、推奨されていません。安全性が低いと、クライアントが自己署名証明書を信頼し、証明書チェーンを検証できないことを意味します。証明書が信頼できる機関によって発行されたことを検証できず、その証明機関が妥協した証明書を失効したことを検証できません。このシナリオでは、各クライアントにサービス証明書をインストールする必要があります。これは、自己署名証明書を信頼する唯一の方法です(インストール自体は実際には信頼です)。

これはセキュリティのしくみです。独自のものを構築することができますが、最終的にはそれを本当に安全にするために非対称暗号化を使用するPKI(秘密鍵インフラストラクチャ)が必要になります。証明書は、主にパブリックキーとプライベートキーのラップ、格納、転送に関するものです。

+0

これは私が考えていたものです。顧客が暗号化を必要とせず、証明書をインストール/支払う必要がない場合(私は彼に推薦する解決策ではありませんが、私は知る必要があります) :私はここにチェックしてもらえますか?私はいくつかの証明書はhttpだけで動作すると思いますか? – J4N

+0

SSLサーバー証明書が機能します。独自のカスタムソリューションを作成したい場合は、それはあなた次第です。それを渡す前にメッセージコンテンツを暗号化し、受け取った後に復号化する必要があります。おそらく、カスタムメッセージインスペクタまたはカスタムチャネル/エンコーダがそれを行います。暗号化のために鍵を安全に保管する方法を見つけなければなりません(これはまさに証明書と同じです)。 –

+0

もう1つ懸念していただきありがとうございます。サーバーがカスタマーネットワークでのみアクセスできる場合はどうなりますか?私は信じられた出版社のために?内部ネットワーク名またはプライベートIPの正当なSSL証明書を取得できますか? – J4N