2009-04-10 7 views
1

カスタムX509証明書の検証をBasicHttpBinding(またはトランスポートのみのセキュリティを実装する同じ問題のCustomHttpBinding)に結び付ける簡単な方法はありますか?BasicHttpSecurityMode.Transportを指定したカスタムX509CertificateValidator?

EDIT1:私はそれが

のいずれかを起動していないことを示すのためのコードにServerCertificateValidationCallbackを追加しましたがここで私がやろうとしているものです:

1)カスタムX509CertificateValidatorを書きました:

public class MyX509Validator : X509CertificateValidator 
{ 
    public override void Validate(X509Certificate2 certificate) 
    { 
     Console.WriteLine("Incoming validation: subj={0}, thumb={1}", 
       certificate.Subject, certificate.Thumbprint); 
    } 
} 

2)がホストを作成しました:

var soapBinding = new BasicHttpBinding() { Namespace = "http://test.com" }; 
soapBinding.Security.Mode = BasicHttpSecurityMode.Transport; 
soapBinding.Security.Transport.ClientCredentialType = 
      HttpClientCredentialType.Certificate; 

var sh = new ServiceHost(typeof(Service1), uri); 
sh.AddServiceEndpoint(typeof(IService1), soapBinding, ""); 
sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, 
      StoreName.My, X509FindType.FindBySubjectName, "localhost"); 
sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode = 
      System.ServiceModel.Security.X509CertificateValidationMode.Custom; 
sh.Credentials.ClientCertificate.Authentication.CustomCertificateValidator = 
      new MyX509Validator(); 
System.Net.ServicePointManager.ServerCertificateValidationCallback += 
      delegate(object sender, X509Certificate certificate, 
        X509Chain chain, SslPolicyErrors sslPolicyErrors) 
      { 
       Console.WriteLine("Incoming validation: subj={0}, thumb={1}", 
        certificate.Subject, certificate.GetIssuerName()); 
       return true; 
      }; 
sh.Open(); 

3)作成したWCFクライアント:

var binding = new BasicHttpBinding(); 
binding.Security.Mode = BasicHttpSecurityMode.Transport; 
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
var cli = new ServiceReference2.Service1Client(binding, 
      new EndpointAddress("https://localhost:801/Service1")); 
cli.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, 
      StoreName.My, X509FindType.FindBySubjectName, "localhost"); 
cli.HelloWorld(); 

認証が正常に動作しますが、MyX509Validator.Validate()が呼び出されることは決してありません。私はX509CertificateValidatorがメッセージのセキュリティでのみ動作し、トランスポートでは動作しないという疑いがあります。そうですか?トランスポートレベルの証明書の検証を無効にするためにできることはありますか?

答えて

1

私はあなたがもしそうならHTTPS ...

に結ばれた証明書について話している、ここでの答えであると仮定しています:X509CertificateValidationModeはあなたが交換されている文書のヘッダ内で使用されます認証を提供する。これは、基になるトランスポート自体は何もしません。この場合、HTTPSと関連するx.509証明書があります。だから、あなたはあなたの前提にスポットを当てています。

トランスポートのカスタム証明書検証を提供する場合は、代わりにSystem.Net.ServicePointManager.ServerCertificateValidationCallbackを使用してください。注意してください、これはアプリの幅広い設定です。複数のエンドポイントを循環し、これをヌルに設定しない場合、アクティブなままです。

+0

おかげで回答!それはほとんどホームランでしたが、ServerCertificateValidationCallbackがクライアントではなくサーバーからの証明書だけを検証することは明らかです:(しかし、それは素晴らしいアイデアでした、私のupvoteを手に入れました – galets

+0

スイングとミス。私はあなたがホスト側にいるとは思わなかった... –

+0

何らかの例外を受け取りましたか?クライアントまたはサーバー側の例外ですか –

0

私は次の設定を使用して、これをやっているし、私のカスタムバリデータが確実にヒットを取得します:

serviceHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode = 
    X509CertificateValidationMode.Custom; 

serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator = 
    new CertificateValidator(ConfigurationManager.AppSettings["Cerficate"]); 

私の行動は次のとおりです。

<behavior name="CustomCertificateBehavior"> 
     <serviceCredentials> 
     <clientCertificate> 
      <authentication certificateValidationMode="Custom" /> 
     </clientCertificate> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 

そして、私は、結合のための:

<basicHttpBinding> 
    <binding name="SecureBinding" maxReceivedMessageSize="5242880"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Certificate"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
+0

IISホスト環境で発生します。 –

+0

そのserviceHost ....コードはどこにありますか? 'クライアント'または 'サービス'で?私はカスタムバリデータを持っていますコンストラクタを介していくつかの情報を渡すことはできますが、それを引き出す方法を理解することはできません。 – Terry

関連する問題