C#でHTTPSのWebページをダウンロードする

C#でウェブサイトのページを取得したい場合には「System.Net.WebClient」クラスを使うと便利です。

WebClientクラスの使い方は「C#でWebページをダウンロードする」で解説していますが、取得したいウェブサイトのURLが https://… の場合は注意が必要です。

 

WebExceptionが発生する

WebClientクラスを使って HTTPS のサイトをダウンロードしようとすると以下のような例外が発生する場合があります。

 

SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした

 

 

 

HTTPとちがってHTTPSでは内容が暗号化されて通信されます。

暗号化のプロトコルは「SSL/TLS」などと呼ばれますがこれにはバージョンがあります。

古いバージョンのプロトコルには脆弱性がある為、古いプロトコルでは接続できないようにしているサイトが多くあります。

 

アクセスする側のプログラムもサイトにあったプロトコルを利用する必要があります。

セキュリティプロトコルを指定する

ServicePointManagerクラスの「SecurityProtocol」プロパティを使って利用するプロトコルを指定します。プロトコルは複数指定する事が可能です。

 

static void Main()
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    WebClient wc = new WebClient();
    System.IO.Stream st = wc.OpenRead("https://www.yahoo.co.jp/");
}

※.Net Framework 4.7以降では「SecurityProtocolType.SystemDefault」という値が追加され、最適なプロトコルが選択されるようになっているようなので、このような設定は必要ないかもしれません