Mensaje de error
The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch
También se muestra como
- The remote certificate is invalid according to the validation procedure.
Las versiones antiguas de .NET imprimían solo «The remote certificate is invalid according to the validation procedure.» sin nombrar el error; el .NET actual añade el valor de SslPolicyErrors. HttpClient lo envuelve en «The SSL connection could not be established, see inner exception.»
.NET SslStream / HttpClient — SslPolicyErrors.RemoteCertificateNameMismatch
Qué significa
La cadena de certificados del servidor es de confianza, pero el nombre de host al que se conectó .NET no figura entre los nombres para los que se emitió el certificado (sus nombres alternativos del sujeto). El texto «according to the validation procedure» se usa para SslPolicyErrors como las discrepancias de nombre, a diferencia de «errors in the certificate chain», que se usa para problemas de confianza y de fechas.
Por qué ocurre
El certificado no incluye este nombre de host
frecuenteUn subdominio nuevo, un nombre de entorno o el dominio sin subdominio que faltan en la lista SAN.
Conexión por dirección IP, localhost o un alias de contenedor
frecuenteLos nombres de servicio de docker-compose o Kubernetes y las direcciones IP tal cual no figuran en los certificados emitidos para nombres públicos.
Conexiones a SQL Server por IP o alias con Encrypt=True
ocasionalMicrosoft.Data.SqlClient valida el certificado del servidor por defecto (Encrypt=True desde la versión 4); conectarse por IP o por un nombre corto a un servidor cuyo certificado lleva su FQDN no supera la comprobación del nombre.
Cómo solucionarlo
- 1.
Comparar los nombres del certificado con la URL
Imprime la lista SAN del 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.
Conectarse con un nombre del certificado
Cambia la URL y la resolución de nombres en lugar de desactivar la validación.
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: establecer HostNameInCertificate
Microsoft.Data.SqlClient 5.0 y posteriores aceptan HostNameInCertificate, de modo que puedes conectarte por dirección mientras se valida el nombre real del certificado; TrustServerCertificate=True, en cambio, omite toda la validación y no debería usarse fuera de entornos desechables.
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;