Я пытаюсь вызвать веб-службу, развернутую на сервере 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 в доверенные корневые центры сертификации.