Fehlermeldung
The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch
Auch ausgegeben als
- The remote certificate is invalid according to the validation procedure.
Ältere .NET-Versionen gaben nur „The remote certificate is invalid according to the validation procedure.“ aus, ohne den Fehler zu nennen; aktuelles .NET hängt den Wert von SslPolicyErrors an. HttpClient verpackt den Fehler in „The SSL connection could not be established, see inner exception.“
.NET SslStream / HttpClient — SslPolicyErrors.RemoteCertificateNameMismatch
Was der Fehler bedeutet
Die Zertifikatskette des Servers ist vertrauenswürdig, aber der Hostname, mit dem sich .NET verbunden hat, gehört nicht zu den Namen, für die das Zertifikat ausgestellt wurde (seinen Subject Alternative Names). Der Text „according to the validation procedure“ steht bei SslPolicyErrors wie Namensabweichungen, im Gegensatz zu „errors in the certificate chain“ bei Problemen mit Vertrauen und Datum.
Warum der Fehler auftritt
Das Zertifikat führt diesen Hostnamen nicht auf
häufigEine neue Subdomain, ein Umgebungsname oder die nackte Domain fehlt in der SAN-Liste.
Verbindung per IP-Adresse, localhost oder Container-Alias
häufigDienstnamen in docker-compose oder Kubernetes und rohe IP-Adressen stehen nicht in Zertifikaten, die für öffentliche Namen ausgestellt sind.
SQL-Server-Verbindungen per IP oder Alias mit Encrypt=True
gelegentlichMicrosoft.Data.SqlClient validiert das Serverzertifikat standardmäßig (Encrypt=True seit Version 4); eine Verbindung per IP oder Kurznamen zu einem Server, dessen Zertifikat seinen FQDN trägt, scheitert an der Namensprüfung.
So behebst du den Fehler
- 1.
Namen im Zertifikat mit der URL vergleichen
Gib die SAN-Liste des ausgelieferten Zertifikats aus.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName - 2.
Mit einem Namen aus dem Zertifikat verbinden
Ändere die URL und die Namensauflösung, statt die Validierung abzuschalten.
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 setzen
Microsoft.Data.SqlClient ab 5.0 akzeptiert HostNameInCertificate, sodass du dich per Adresse verbinden und trotzdem den echten Namen des Zertifikats validieren kannst; TrustServerCertificate=True überspringt dagegen jede Validierung und sollte außerhalb von Wegwerfumgebungen nicht verwendet werden.
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;