はじめに
ServicePointManager.SecurityProtocolを設定していないためにずっとエラーがでていました。気づかずに無駄なデバッグ作業を多くしてしまったので、記事にして忘れないようにしたいと思います。
最新の .NET バージョンおよびオペレーティング システム環境の場合、TLS のバージョンを明示的に設定する必要はないらしい。
SecurityProtocolとは
ServicePointManager.SecurityProtocol は、.NET アプリケーションで通信に使用する TLS(Transport Layer Security)のバージョンを指定するためのプロパティです。TLSは、インターネット通信のセキュリティを保護するプロトコルです。特に、HTTPS通信などで重要な役割を果たします。
こうやって設定します。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
なお、TLS 1.3については、.NET Frameworkではサポートされていません。 TLS 1.3は、.NET 5.0以降やそれに対応する環境でのみ使用可能です。
.NET Framework の場合でも Windows 11 と .NET Framework 4.6.2 以降なら TLS 1.3 に対応している。
必要な理由
-
セキュリティ向上 : TLSには複数のバージョンがあり、古いバージョン(例:TLS 1.0やTLS 1.1)は既知の脆弱性を抱えているため、現代の安全な通信にはTLS 1.2以上の使用が推奨されます。これにより、通信の暗号化強度が向上し、より安全な通信が保証されます。
-
接続の互換性 : 一部のサーバーでは最新のTLSバージョンのみをサポートしている場合があります。適切なTLSバージョンを指定することで、接続エラーを防ぎ、確実な通信が可能になります。
設定しないとどうなるか
- 安全性の低下 : 設定を行わない場合、.NET Frameworkはシステム既定のTLSバージョン(通常はTLS 1.0やTLS 1.1)を使用するため、通信自体は暗号化されますが、セキュリティ面でリスクがあります。古いTLSバージョンはその暗号化方式に脆弱性があるため、攻撃者による悪用のリスクが高まります。
- 接続エラー: サーバー側がTLS 1.2以上を必須としている場合、古いバージョンでの接続ではエラーが発生することがあります。
- 脆弱性 : 古いTLSバージョンを使用すると、通信内容が解読されるリスクが高まるため、常に最新のバージョンを使用することが推奨されます。
エラーの有無
設定を行わない場合、接続先のサーバーや実行環境によって結果が異なります。以下のようなケースがあります。
エラーが発生しない場合:
- デフォルト設定の場合 : .NET Frameworkはシステム既定のTLSバージョンを使用します。サーバーが古いバージョンにも対応していれば接続が成功することがありますが、その場合もセキュリティリスクが伴います。
- 古いTLSバージョンに対応している場合 : 接続は成功しますが、暗号化の強度が低いため、通信内容が保護されていない可能性があります。
エラーが発生しない場合でも、古いTLSバージョンを使うと暗号化の強度が弱くなる。
エラーが発生する場合:
- サーバーが最新のTLSバージョンを要求している場合 : サーバー側がTLS 1.2以上を要求している場合、古いバージョンで接続しようとするとエラーが発生します。この場合、ServicePointManager.SecurityProtocolでTLS 1.2を指定することで接続が成功します。
- システムがTLS 1.2以上に対応していない場合 : 古いOSや.NET Frameworkのバージョンでは、TLS 1.2をサポートしていないことがあり、その場合接続エラーが発生する可能性があります。
おわりに
未来の自分が同じことに時間をたくさん割かないように。がんばれ!