はじめに
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はフラグなので、上記サンプルではエラーが組み合わせになった場合正しくハンドルできません。なので、そこはそこできちんと実装してくださいな。