Как запустить доверенное соединение 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.

Valid server certificate in Chrome

см. снимок экрана, сделанный из Хром. Сертификат действителен. Я создал свой собственный сертификат центра сертификации (самозаверяющий сертификат), а затем использовал его для создания сертификата сервера. Я заполнил имя субъекта. В качестве альтернативного имени субъекта (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-адресом в альтернативном имени субъекта