Как запустить доверенное соединение TLS с сервером по IP-адресу с помощью HttpClient в C#?
Я пытаюсь настроить TLS-соединение с приложением, запущенным в (локальной) виртуальной машине, используя C#'S HttpClient
на Windows. Однако, это приводит к RemoteCertificateNameMismatch
ошибка каждый раз.
этот кусок кода:
HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (request, cert, chain, policyErrors) =>
{
Console.WriteLine($"Policy Errors: {policyErrors}");
return policyErrors == SslPolicyErrors.None;
};
HttpClient httpClient = new HttpClient(handler)
{
BaseAddress = new Uri("https://192.168.99.100/engine-rest")
};
var result = httpClient.GetAsync("/engine").Result;
приводит к этой ошибке:
Policy Errors: RemoteCertificateNameMismatch
Unhandled Exception: System.AggregateException: One or more errors occurred. (An error occurred while sending the request.) ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpxception: A security error occurred
at System.Net.Http.WinHttpRequestCallback.OnRequestSendingRequest(WinHttpRequestState state)
at System.Net.Http.WinHttpRequestCallback.RequestCallback(IntPtr handle, WinHttpRequestState state, UInt32 internetStatus, IntPtr statusInformation, UInt32 statusInformationLength)
однако мой сертификат действителен в соответствии с Google Chrome и Mozilla Firefox, но не для Internet Explorer.
см. снимок экрана, сделанный из Хром. Сертификат действителен. Я создал свой собственный сертификат центра сертификации (самозаверяющий сертификат), а затем использовал его для создания сертификата сервера. Я заполнил имя субъекта. В качестве альтернативного имени субъекта (SAN) я добавил IP-адрес.
поле IP-адреса внутри поля SAN не поддерживается в IE и HttpClient? Если да, то есть ли другой способ проверки сертификата сервера с помощью IP-адреса?
Я использую dotnet core 2.0.
1 ответов
читая по аналогичному вопросу, я нашел следующее:
.NET не поддерживает IP-адреса как альтернативные имена субъекта напрямую, потому что он полагается на Schannel для проверки IP-адреса в сертификате.
Schannel ищет только имя хоста (IP), указанное в запросе https среди полей "DNS Name=" сертификата. Поэтому, если вы можете получить CA, чтобы дать вам сертификат с IP-адресами, перечисленными в полях " DNS Name=", тогда это будет наверное, работа.
вы можете попробовать использовать поле "DNS-имя".
источник: поддерживает ли клиент веб-службы .NET SSL-сертификат с IP-адресом в альтернативном имени субъекта