Сообщение об ошибке
The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch
Также выводится как
- The remote certificate is invalid according to the validation procedure.
Старые версии .NET выводили только «The remote certificate is invalid according to the validation procedure.», не называя ошибку; современный .NET добавляет значение SslPolicyErrors. HttpClient оборачивает её в «The SSL connection could not be established, see inner exception.»
.NET SslStream / HttpClient — SslPolicyErrors.RemoteCertificateNameMismatch
Что это означает
.NET доверяет цепочке сертификатов сервера, но имени хоста, к которому он подключился, нет среди имён, на которые выпущен сертификат (его альтернативных имён субъекта, SAN). Текст «according to the validation procedure» используется для значений SslPolicyErrors вроде несовпадения имени, в отличие от «errors in the certificate chain» для проблем с доверием и датами.
Почему это происходит
Этого имени хоста нет в сертификате
частоНовый поддомен, имя окружения или домен без www, которых нет в списке SAN.
Подключение по IP-адресу, localhost или псевдониму контейнера
частоИмён сервисов из docker-compose или Kubernetes, как и самих IP-адресов, нет в сертификатах, выпущенных на публичные имена.
Подключения к SQL Server по IP или псевдониму с Encrypt=True
иногдаMicrosoft.Data.SqlClient по умолчанию проверяет сертификат сервера (Encrypt=True начиная с версии 4); при подключении по IP или короткому имени к серверу, в сертификате которого указано его FQDN, проверка имени не проходит.
Как исправить
- 1.
Сравните имена в сертификате с URL
Выведите список SAN сертификата, который отдаёт сервер.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName - 2.
Подключайтесь по имени из сертификата
Измените URL и разрешение имён, а не отключайте проверку.
csharp // Use a host name from the certificate in the URL (resolve it to the address you need via DNS) using var client = new HttpClient(); var response = await client.GetAsync("https://www.example.com/health"); - 3.
SQL Server: задайте HostNameInCertificate
Microsoft.Data.SqlClient 5.0 и новее принимают HostNameInCertificate, так что можно подключаться по адресу и при этом проверять настоящее имя в сертификате; а TrustServerCertificate=True полностью пропускает проверку, и его не следует использовать нигде, кроме одноразовых окружений.
text # Microsoft.Data.SqlClient: connect by IP/alias but validate against the certificate's name Server=10.0.0.5;Database=app;Encrypt=True;HostNameInCertificate=sql01.corp.example.com;