web-dev-qa-db-ja.com

HttpClientを使用した「検証手順に従ってリモート証明書が無効です」

証明書の検証に関する問題を解決できません。

HTTPSを使用してリクエストを処理するWebAPIサーバーがあります。サーバーの証明書には、RCA(ルート)-> ICA(中間)-> WebAPIサーバーの証明書パスがあります。 RCA、ICA、およびWeb APIサーバーは、同じActiveDirectoryドメインのメンバーです。

クライアントアプリケーション(デスクトップ、コンピューターは同じドメインに参加しています)は、HttpClientを使用してサーバーと通信し、次の2つのシナリオをサポートします。

  • 企業ネットワークに接続されています。
  • 企業ネットワークから切断されました(インターネットアクセス)。

どちらのシナリオも基本認証を使用します。
RCAおよびICA証明書は、ローカルコンピューターアカウントの「信頼されたルート証明機関」および「中間証明機関」にそれぞれ配置されます。 RCA証明書は自己署名されています。

これで、クライアントが企業ネットワークに接続されている場合、証明書の検証は期待どおりに機能し、ユーザーはWebAPIと「対話」できます。

クライアントが切断されている場合(インターネット接続のみが使用可能)、証明書の検証はAuthenticationExceptionで失敗します(「リモート証明書は検証手順に従って無効です」)。

証明書の検証を完全にオフにしたくはありませんが、この特定の証明書が有効であることを検証システムに通知する方法が必要です。また、クライアントアプリケーションはSignalRを使用します。これは、デフォルトで独自のトランスポートを使用します。したがって、 this および this はオプションではありません。

RCAとICA証明書を「Trusted ...」フォルダーと「Intermediate ...」フォルダーに配置しても効果がないのはなぜですか?

回避策はありますか?

8
Dennis

発生している問題は、証明書によって提示されたサブジェクトCNがURIのホスト名と一致しないためです。

ホストのパブリックIPアドレスにバインドされた証明書に、リソースへのアクセスに使用しているホスト名と一致するCNがあることを確認してください。

簡単に確認するには、ブラウザでURLを開き、証明書を表示します。 Issued toフィールドにはFQDNが含まれ、URIのホスト名の部分と一致する必要があります。あなたの場合、そうではありません。

5

このコードをプロシージャ本体に挿入します。

static void Main(string[] args)   
{
     ServicePointManager.ServerCertificateValidationCallback =
                delegate (object sender, X509Certificate certificate, X509Chain 
     chain, SslPolicyErrors sslPolicyErrors)
                {
                    return true;
                };
     ....
}
0