Пользовательский X509CertificateValidator с BasicHttpSecurityMode.Transport? - PullRequest
1 голос
/ 10 апреля 2009

Существует ли простой способ привязать пользовательскую проверку сертификата X509 к BasicHttpBinding (или CustomHttpBinding для того же вопроса, который будет обеспечивать безопасность только для транспорта)?

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 работает только для безопасности сообщений, а не для транспорта. Это правильно? Могу ли я что-то сделать, чтобы переопределить проверку сертификата транспортного уровня?

Ответы [ 2 ]

1 голос
/ 13 апреля 2009

Я предполагаю, что вы говорите о сертификате, который связан с HTTPS ...

Если это так, то вот ответ: X509CertificateValidationMode используется в заголовке документа, которым вы обмениваетесь, для обеспечения аутентификации. Он ничего не делает для самого базового транспорта, которым в данном случае является HTTPS со связанным с ним сертификатом x.509. Итак, вы точно придерживаетесь своего предположения.

Если вы хотите предоставить собственную проверку сертификата для транспорта, используйте System.Net.ServicePointManager.ServerCertificateValidationCallback. Но будьте осторожны, это широкая настройка приложения. Если вы перебираете несколько конечных точек и не устанавливаете это значение в нуль, оно останется активным.

0 голосов
/ 04 октября 2012

Я делаю это, используя следующие настройки, и мой пользовательский валидатор определенно получает удар:

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>
...