Перейти к содержимому
ecdsa.com
.NET SslStream / HttpClient.NET

Сообщение об ошибке

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» для проблем с доверием и датами.

Почему это происходит

Как исправить

  1. 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. 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. 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;

Связанные ошибки

Открыть всю базу ошибок подписей