LoginSignup
3
2

More than 5 years have passed since last update.

System.Net.Http.HttpClientで証明書のホスト名と実際のホスト名が異なる場合のエラーを回避

Last updated at Posted at 2018-06-29

はじめに

C#のSystem.Net.Http.HttpClientで自己署名証明書で適当に作ったサーバーに接続したらエラーになったのでこれを回避する方法を探してみた。
古い情報だと、WebRequestとか使ってるときにServicePointManager.ServerCertificateValidationCallbackを指定すればいいみたいな記事が多いんだけど、System.Net.Http.HttpClientを使ってるとこの手は使えないみたい。
で、よくよく調べてみると別の方法で回避するようなので残しておきます。

環境

  • Windows 10 1803
  • .Net Core 2.1

回避方法

要はHttpClient作成時にHttpClientHandlerを渡すんですが、そのときにコールバックを設定しておくということ。

    var handler = new HttpClientHandler() {
        ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
        {
            switch (sslPolicyErrors)
            {
                case SslPolicyErrors.None:
                case SslPolicyErrors.RemoteCertificateNameMismatch:
                    return true;
                default:
                    return false ;
            }
        }
    };

    using (HttpClient client = new HttpClient(handler))
    {
        .....
    }

いくつか参考になったサイトはあったけど、コールバックで単純にtrueを返している例が多いので、もうちょっとちゃんとエラーを見て、その他のエラーはハンドルしないようにしてみました。

ちなみに、通常のサーバーに接続するときはちゃんと名前をチェックして無視しない方が安全です。ホスト名が変わったりするときなどにやむを得ず回避する場合に限って使いましょう。

(追記:2018/7/9)
sslPolicyErrorsはフラグなので、上記サンプルではエラーが組み合わせになった場合正しくハンドルできません。なので、そこはそこできちんと実装してくださいな。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2