本文へスキップ
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 が接続したホスト名が、証明書の発行対象である名前(サブジェクト代替名)に含まれていません。「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;

関連するエラー

署名エラーデータベースをすべて見る