エラーメッセージ
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 が接続したホスト名が、証明書の発行対象である名前(サブジェクト代替名)に含まれていません。「according to the validation procedure」という文言は名前の不一致などの SslPolicyErrors に使われ、信頼や日付の問題には「errors in the certificate chain」が使われます。
発生する理由
証明書にこのホスト名が含まれていない
よくある新しいサブドメイン、環境名、またはサブドメインなしのドメインが SAN リストに含まれていないケースです。
IP アドレス、localhost、コンテナーのエイリアスで接続している
よくあるdocker-compose や Kubernetes のサービス名、IP アドレスそのものは、公開ドメイン名向けに発行された証明書には含まれていません。
Encrypt=True で IP アドレスやエイリアスを使った SQL Server 接続
ときどきMicrosoft.Data.SqlClient はデフォルトでサーバー証明書を検証します(バージョン 4 以降は Encrypt=True)。証明書に FQDN が記載されているサーバーに IP アドレスや短い名前で接続すると、名前の確認で失敗します。
修正方法
- 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;