ひさしぶりに HttpWebRequest クラスを使って、リモートの Web サーバーに置いてあるファイルにローカルからアクセスしようとしたら、下記のようなエラーが出た。
要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした
以前は普通に使えていたのになぜ?と思って調べてみたら、私が竜宮城で遊んでいる間に、世の中の暗号化通信の規格が変わっていたのが理由らしい。
以前は、ネットでの暗号化通信といえば SSL(Secure Sockets Layer)だったけれど、2014年9月に SSL3.0 のプロトコルの脆弱性が発見され、2015年6月にはインターネット技術の標準化団体 IETF(Internet Engineering Task Force)が SSL 3.0 の使用を禁止。そして SSL は TLS(Transport Layer Security)に取って代わられ、つい先日の 2018年8月10日には IETF が「TLS 1.3」を公開したばかり・・・とのこと。
いや~~~、Web サーバーと通信するプログラムなんてしばらくやってなかったから意識の外にあった。全然気にしてなかった・・・。
プログラムの修正は簡単で、HttpWebRequest(または WebRequest、WebClient、WebService、SoapHttpClientProtocol 等の)クラスを使用する前に、下記のように書いておけば良いらしい。
Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls Or Net.SecurityProtocolType.Tls11 Or Net.SecurityProtocolType.Tls12
主に参考にした記事:.NET Framework で TLS1.1 および 1.2 を有効化する方法
- .NET Framework 3.5 以上(上のリンク先の記事本文には 4.5 以上と書いてあるが、変更履歴と追記のところに 3.5 も対応したと書いてある)
- Windows 7 以降、Windows Server 2008 R2 以降
Net.SecurityProtocolType.Tls の指定は、古いからもう不要なのかな?
.NET Framework 4.6 以降では上記の記述が無くてもエラーが発生しないようでした。
今回の件があったので調べているうちに気付いたのだが、ついこの前(2018-06-14)、当サイトを設置しているレンタルサーバーの会社 XSERVER から、「6月20日に TLS 1.0/1.1 を無効にします」というメールが届いていた。今後は TLS 1.2 以降のみの対応になるらしい。いや~~~、興味が無かったので完全スルーしてました・・・。