Конфигурация для аутентификации ClientCredentials ServiceCertificate не применяется или не используется - PullRequest
0 голосов
/ 27 марта 2020

Я создаю приложение. NET Core 3.1, в котором я пытаюсь вызвать службу WCF через HTTPS и временно отключаю SSL-аутентификацию для сертификата сервера.

Существует четко документированный способ достижения этой цели. , А именно, установив свойство ServiceCertificate.SslCertificateAuthentication в классе ChannelFactory.

Ниже приведен код для настройки het Binding, endpoint и ClientCredentials.

var endpointAddress = new EndpointAddress("https://*.com");
var binding = new BasicHttpsBinding();

binding.Security.Mode = BasicHttpsSecurityMode.Transport;
binding.Security.Transport = new HttpTransportSecurity()
{
  ClientCredentialType = HttpClientCredentialType.None
};

var factory = new ChannelFactory<IService>(binding, endpointAddress);
factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication()
{
  CertificateValidationMode = X509CertificateValidationMode.None,
  RevocationMode = X509RevocationMode.NoCheck
};

factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
factory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;

var client = factory.CreateChannel();
client.Call();

Однако при запуске этого код я получаю цепочку исключений:

  • Не удалось установить sh доверительные отношения для безопасного канала SSL / TLS с полномочиями «домен»
  • Не удалось установить соединение SSL, увидеть внутреннее исключение
  • Ошибка аутентификации, см. Внутреннее исключение. Полученное сообщение
  • было неожиданным или неправильно отформатированным.

Я ожидаю, что клиент WCF пропустил аутентификацию SSL.

Я также пытался использовать собственный сертификат валидатор, расширив X509CertificateValidator и сконфигурировав его следующим образом:

factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication()
{
  CertificateValidationMode = X509CertificateValidationMode.Custom,
  CustomCertificateValidator = new CustomCertificateValidator();
};

factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
factory.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator();

Как и следовало ожидать в этом пункте, я получаю те же исключения, что и раньше. Еще хуже то, что мой метод CustomCertificate.Validate (..) вообще не вызывался.

Кажется, что WCF предоставляет API, который позволяет немного контролировать, но независимо от того, что я пытаюсь, мои политики / Кажется, что конфигурации никак не соблюдаются.

Что здесь может происходить?

1 Ответ

0 голосов
/ 31 марта 2020

Приведенный ниже код будет работать, когда требуется SSL-аутентификация в проекте DotCore.

Uri uri = new Uri("https://vabqia969vm:21011");
            BasicHttpsBinding binding = new BasicHttpsBinding();
            binding.Security.Mode = BasicHttpsSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
            ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress(uri));

            factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new System.ServiceModel.Security.X509ServiceCertificateAuthentication()
            {
                CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None,
                RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
            };

            //these two lines will not work.
            //factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
            //factory.Credentials.ServiceCertificate.Authentication.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck;

            var client = factory.CreateChannel();
            var result = client.TestAsync();
            Console.WriteLine(result.Result);

С моей стороны, он работает отлично. Я думаю, что что-то не так с серверной стороной. Как вы знаете, мы должны убедиться, что тип привязки между клиентской и серверной сторонами согласован. Каковы подробности на стороне сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...