カスタム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
がメッセージのセキュリティでのみ動作し、トランスポートでは動作しないという疑いがあります。そうですか?トランスポートレベルの証明書の検証を無効にするためにできることはありますか?
おかげで回答!それはほとんどホームランでしたが、ServerCertificateValidationCallbackがクライアントではなくサーバーからの証明書だけを検証することは明らかです:(しかし、それは素晴らしいアイデアでした、私のupvoteを手に入れました – galets
スイングとミス。私はあなたがホスト側にいるとは思わなかった... –
何らかの例外を受け取りましたか?クライアントまたはサーバー側の例外ですか –