Mensagem de erro
The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch
Também aparece como
- The remote certificate is invalid according to the validation procedure.
Versões mais antigas do .NET imprimiam só “The remote certificate is invalid according to the validation procedure.”, sem indicar o erro; o .NET atual acrescenta o valor de SslPolicyErrors. O HttpClient o encapsula em “The SSL connection could not be established, see inner exception.”
.NET SslStream / HttpClient — SslPolicyErrors.RemoteCertificateNameMismatch
O que significa
A cadeia de certificados do servidor é confiável, mas o nome de host ao qual o .NET se conectou não está entre os nomes para os quais o certificado foi emitido (os Subject Alternative Names dele). O texto “according to the validation procedure” é usado para SslPolicyErrors como divergências de nome, ao contrário de “errors in the certificate chain”, usado para problemas de confiança e de data.
Por que acontece
O certificado não lista este nome de host
comumUm subdomínio novo, um nome de ambiente ou o domínio sem www que não está na lista de SANs.
Conexão por endereço IP, localhost ou alias de contêiner
comumNomes de serviço do docker-compose ou do Kubernetes e endereços IP puros não constam em certificados emitidos para nomes públicos.
Conexões ao SQL Server por IP ou alias com Encrypt=True
ocasionalO Microsoft.Data.SqlClient valida o certificado do servidor por padrão (Encrypt=True desde a versão 4); conectar-se por IP ou por um nome curto a um servidor cujo certificado traz o FQDN dele não passa na verificação de nome.
Como corrigir
- 1.
Comparar os nomes do certificado com a URL
Imprima a lista de SANs do certificado servido.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName - 2.
Conectar com um nome que consta no certificado
Mude a URL e a resolução de nomes em vez de desativar a validação.
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: definir HostNameInCertificate
O Microsoft.Data.SqlClient 5.0 e posteriores aceitam HostNameInCertificate, para que você se conecte pelo endereço enquanto valida o nome real do certificado; já TrustServerCertificate=True ignora toda a validação e não convém usá-lo fora de ambientes descartáveis.
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;