Как игнорировать проверку SSL в .net core 2.1 - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь вызвать веб-службу, развернутую на сервере Linux, которая имеет самозаверяющий сертификат из приложения, разработанного в ядре .net и развернутого на сервере IIS (Windows Server 2012).

Но когда я пытаюсь вызвать конечную точку, появляется следующая ошибка:

«Сообщение»: «Не удалось установить соединение SSL, см. Внутреннее исключение.», «Описание»: «InnerError:System.Security.Authentication.AuthenticationException: проверка подлинности не удалась, см. Внутреннее исключение. ---> System.ComponentModel.Win32Exception: Mensaje recibido inesperado, o bien su formatoes incorrecto \ r \ n --- Конец внутренней трассировки стека исключений -- \ r \ n в System.Net.Security.SslState.StartSendAuthResetSignal (сообщение ProtocolToken, AsyncProtocolRequest asyncRequest, исключение ExceptionDispatchInfo) \ r \ n в System.Net.Security.SslState.CheckCompletionBequynReRevice_Requestв System.Net.Security.SslState.StartSendBlob (Byte [] incoming, счетчик Int32, AsyncProtocolRequest asyncRequest) \ r \ n в System.Net.Security.SslState.ProcessReceivedBlob (буфер Byte [], счетчик Int32, AsyncProtocolRequest asyncRequest) \ r \ n в System.Net.Security.SslStra.meteart[] буфер, Int32 readBytes, AsyncProtocolRequest asyncRequest) \ r \ n в System.Net.Security.SslState.PartialFrameCallback (AsyncProtocolRequest asyncRequest) \ r \ n --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- \r \ n в System.Net.Security.SslState.ThrowIfExceptional () \ r \ n в System.Net.Security.SslState.InternalEndProcessAuthentication (LazyAsyncResult lazyResult) \ r \ n в System.Net.Security.SslState.Eses) \ r \ n в System.Net.Security.SslStream.EndAuthenticateAsClient (IAsyncResult asyncResult) \ r \ n в System.Net.Security.SslStream. <> c.b__47_1 (IAsyncResult iar) \ r \ n в System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction, действие 1 endAction, Task 1 обещание, логическое значение требует синхронизации) \ r \ n --- Конец трассировки стека отпредыдущее местоположение, где было сгенерировано исключение --- \ r \ n в System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore (Поток потока, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken) |stackTrace: at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore (Поток потока, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken) \ r \ n в System.Threading.Tasks.ValueTask 1.get_Result()\r\n at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Threading.Tasks.ValueTask 1. \ r..Http.HttpConnectionPool.WaitForCreatedConnectionAsync (ValueTask 1 creationTask)\r\n at System.Threading.Tasks.ValueTask 1.get_Result () \ r \ n в System.Net.Http.HttpConnectionPool.SendWithRetryAsync (запрос HttpRequestMessage.okotHell.RegTell.RegTell),.CallXMLFormDataApiPostAsyc (тело строки) в C: \ gitProjects \ ResevasProxy \ ReservasProxy \ ReservasProxy \ Data \ APIConnection.cs: строка 181 \ r \ n

Я уже пробовал следующие решения, но они не сделалиработа.

Решение 1:

          using (var httpClientHandler = new HttpClientHandler())
        {
            httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
            // Make your request...
            //send request
            using (var httpClient = new HttpClient(httpClientHandler))
            {

                var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
                HttpResponseMessage response = await httpClient.PostAsync(_url, content);
                //var res = await response.Content.ReadAsAsync<T>();


            }


        }

Решение 2:

            //send request
        using (var httpClient = new HttpClient())
        {
             ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
            ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
            var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
            HttpResponseMessage response = await httpClient.PostAsync(_url, content);

        }

Решение 3: Попытка импортировать сертификат и затем выполнить вызов, но все еще не работает.

const string certPath = @"C:\soaProdcer.cer";    
var handler = new HttpClientHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual,
                SslProtocols = System.Security.Authentication.SslProtocols.Tls
            };
            handler.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(certPath));

            //send request
            using (var httpClient = new HttpClient(handler))
            {
                var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
                HttpResponseMessage response = await httpClient.PostAsync(_url, content);

            }

Я получил сертификат с использованием OpenSSL

>openssl s_client -showcerts -connect serversoa:443

No client certificate CA names sent
---
SSL handshake has read 774 bytes and written 493 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-SHA
    Session-ID: 4E0F69C75B8F041101562F7E9B3EA349
    Session-ID-ctx:
    Master-Key: 61A916A9B8AF26281B5F7A0138DF5E4C2A4B83995E0B3FDD2274BAD0D8E3C2B5E98AA7CCB48A6543F6814C2540B18848
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1558979896
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)

Я импортировал сертификат на сервер IIS в доверенные корневые центры сертификации.

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Ошибка не указывает на проблему с центром сертификации, а скорее на ответ от сервера, который не ожидается для установления TLS.

Как выяснил автор, клиент поддерживает 1.2 и сервер 1.0, и это вызвало проблемы.

P.S. Я бы порекомендовал использовать только TLS 1.2, если этот вариант с поддержкой браузера вам необходим. (только старые версии не поддерживают 1.2.)

1 голос
/ 28 мая 2019

Я точно не помню, как ссылка Microsoft говорила вам об этом. Ваши вышеупомянутые решения хорошо работают со старой версией ядра asp.net. Это мое решение с последним ядром ASP.NET, которое я реализовал для своего проекта. Я надеюсь, что это поможет вам.

services.AddHttpClient<IYourService, YourService>()
    .ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
    {
        AllowAutoRedirect = false,
        ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true,
        SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12
    });

Пожалуйста, прочитайте также о HttpClientFactory: https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

0 голосов
/ 28 мая 2019

Как сказал Илья, проблем с центром сертификации не было. Проблема заключалась в том, что клиент пытался использовать другую версию TLS (1.2) Решением было указать версию TLS.

using (var httpClientHandler = new HttpClientHandler())
            {
                httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
                httpClientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls;
                //send request
                using (var httpClient = new HttpClient(httpClientHandler))
                {
                    var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
                    HttpResponseMessage response = await httpClient.PostAsync(_url, content);

                }
            }

Я использовал Wireshark, чтобы перехватить трафик и посмотреть, что происходит ...

Клиент отправляет привет с версией, не поддерживается Client sending hello with version, not supported

Сервер, закрывающий соединение enter image description here


После завершения теста на моем компьютере и успешных тестов я развертываю приложение на сервере IIS. Когда я начал тестировать свое приложение на сервере, оно начало выдавать то же исключение, что и раньше.

Почему?

Оказалось, что сервер деактивировал шифр (RC4), как показано на следующем рисунке. enter image description here

Так что, если вы используете Windows, как я, вам просто нужно проверить шифры, которые использует сертификат. Как я уже упоминал ранее, сервер Linux использовал шифр CR4 в сертификате

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