.NET Framework で TLS1.1 および 1.2 を有効化する方法


更新履歴
2016/6/16 .NET Framework 3.5 が TLS1.1/1.2 に対応しました!
2017/7/20 .NET Framework 4.5 以降での既定値が変更になりました!

こんにちは。Internet Explorer サポート チームの鶴巻です。

昨年 SSL3.0 のプロトコル自体に脆弱性 (POODLE) が発見され、IT 業界全体の問題となりました。
.NET Framework で開発している既存プログラムを TLS1.1 および 1.2 に対応したいとのお問い合わせをよくいただきます。

今回は、特にお問い合わせの多い HttpWebRequest ご利用時に、TLS1.1 および 1.2 を有効にする方法をご紹介します。

TLS1.1 および 1.2 を有効にする方法

HttpWebRequest クラスは、既定の状態では SSL3.0 および TLS1.0 が有効です。
System.Net.ServicePointManager クラスの SecurityProtocol プロパティで TLS1.1 および 1.2 を有効にできます。
※ Internet Explorer の TLS1.1 もしくは 1.2 の設定では有効にできません。

C# : ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
VB : ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12

TLS1.1 および 1.2 を利用するには以下の環境が必要です。

  • .NET Framework 4.5 以上 (.NET Framework 4.0 以前では TLS1.0 までしか利用できません)
  • Windows 7 および Windows Server 2008 R2 以降

以下のクラスを利用している場合も同様の方法で対応可能です。

(2017/7/20 追記)
以下の公開情報にありますように、本セキュリティ アドバイザリに記載の更新プログラムを適用することで、.NET Framework 4.5 環境において SecurityProtocol プロパティの既定値が SSL 3.0 および TLS 1.0 から、TLS 1.0、TLS 1.1 および TLS 1.2 へ変更されます。

マイクロソフト セキュリティ アドバイザリ 2960358
https://technet.microsoft.com/ja-jp/library/security/2960358.aspx

更新プログラムの適用が難しい場合には下記のレジストリ値を設定することにより同様の対処を実施することが可能です。
なお、レジストリ値を 0 にする、もしくはレジストリ設定自体を削除することにより、従来通り SSL 3.0 および TLS 1.0 が既定値となります。

キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
名前:SchUseStrongCrypto
種類:REG_DWORD
値:1
※ 64 bit OS 環境の場合は下記のキーにも設定してください
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319

また、.NET Framework 4.6 の環境においては、下記の資料に記載がありますように SecurityProtocol プロパティの既定値が TLS 1.0、TLS 1.1 および TLS 1.2 へリリース時点より変更されています。

Retargeting Changes for Migration from .NET Framework 4.5.2 to 4.6
https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/retargeting/4.5.2-4.6
※ "Networking" をご覧ください

.NET Framework 4.6 の環境で SSL 3.0 および TLS 1.0 を既定値とする場合には、上記の SchUseStrongCrypto のレジストリ値を 0 とする必要があります。
SchUseStrongCrypto のレジストリ値が 1 もしくはレジストリ設定自体が存在しない場合には TLS 1.0、TLS 1.1 および TLS 1.2 が既定値となります。

優先順位について

.NET Framework における暗号化通信では、バージョンによらず暗号強度の高い TLS を優先的に利用します。
中間機器や Web サーバー側の実装によりますが、TLS1.2/1.1/1.0/SSL3.0 のいずれも利用できる場合には、最も暗号強度の高い暗号方式として TLS1.2 を選択します。

(2016/6/16 追記)
.NET Framework 3.5 TLS1.1/1.2 が利用できるようになりました

2016 年 5 月に .NET Framework 3.5 環境向けに TLS1.1 および 1.2 への対応するための更新プログラムを公開しました。

ただし、既定で利用される SSL/TLS のバージョンに変更がないため、指定がない場合は引き続き SSL3.0 および TLS1.0 が既定の動作となります。
.NET Framework 3.5 で TLS1.1/1.2 に対応するには以下のいずれかの方法をご検討ください。

  1. ServicePointManager.SecurityProtocol プロパティを実装する
    HttpWebRequest を使用するアプリケーションのソースコードの変更とリビルドが必要な方法です。
  2. Windows OS の既定値を変更して利用する
    .NET Framework および OS の既定値を変更する方法です。アプリケーションの変更は不要です。

1. ServicePointManager.SecurityProtocol プロパティを実装する
実装方法としては上述のとおりですが、.NET Framework 3.5 では TLS1.1 および TLS1.2 が SecurityProtocolType 列挙体に宣言がないため、以下のサポート技術文書に記載の方法などで独自に定義し、利用する必要があります。

Support for TLS v1.2 included in the .NET Framework version 3.5.1
https://support.microsoft.com/en-us/kb/3154518

※ ご注意点 : Windows Vista / Windows Server 2008 環境について ※
Windows Vista / Windows Server 2008 は OS 自体が TLS1.1/1.2 に対応していません。
このため、上記方法で TLS1.1/1.2 を設定しても通信ができず、TLS1.0 もしくは SSL3.0 も併せて設定する必要があります。
また、本更新プログラムを適用せずに SecurityProtocol プロパティに TLS1.1/1.2 を設定するプログラムを実行すると SecurityProtocol を設定する処理にて例外が発生します。
Windows Vista / Windows Server 2008 環境でアプリケーションを実行する可能性がある場合は、実際の通信では TLS1.1/1.2 を利用できませんがあらかじめ更新プログラムを適用するか、SecurityProtocol を設定する処理を try-catch 構文で処理すること (例外が発生した場合には TLS1.0/SSL3.0 を設定する) をご検討ください。

2. Windows OS の既定値を変更して利用する
System.Net.HttpWebRequest クラスを利用する場合、既定では TLS1.0 で通信を試行しますが、以下の 2 つの対応により、既定で TLS1.2 が利用される動作となります。

  • アプリケーションが OS の既定値を利用するよう設定する
  • Windows OS の既定値を変更する

a. アプリケーションが OS の既定値を利用するよう設定する
以下のレジストリ値を登録することで .NET Framework を利用して開発したアプリケーションも Windows OS の既定値として指定されているプロトコルを利用する動作となります。

キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727
名前:SystemDefaultTlsVersions
種類:REG_DWORD
値:1

※ 64 bit OS の場合、併せて以下のハイブにも同様のレジストリをご登録ください。
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727

b. Windows OS の既定値を変更する
以下のレジストリ値を登録することで、Windows OS の既定値として利用されるプロトコルが変更可能です。

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\<プロトコル>\Client
名前:DisabledByDefault
種類:REG_DWORD
値:0

※ <プロトコル> の箇所には、既定値と設定したいプロトコルを登録ください。
TLS 1.2 を既定値に設定する場合、以下のハイブを登録ください。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.2\Client

※ ご注意点 ※
いずれもレジストリでの設定となりますが存在しない場合には手動で作成し、登録後端末を再起動ください。
端末全体に対する設定となるため、ほかのアプリケーションへの影響がないかどうか十分にご確認ください。
アプリケーションにて ServicePointManager.SecurityProtocol プロパティを明示的に指定している場合には、上記のレジストリではなく ServicePointManager.SecurityProtocol プロパティで定義した値が使用されます。

(2015/4/8 追記)
Internet Explorer で TLS/SSL のバージョンを確認にする方法

.NET Framework とは異なりますが、Internet Explorer をご利用中に [ファイル] - [プロパティ] メニューを確認することで、現在表示中の Web サイトがどのバージョンの SSL / TLS が利用されているか確認できます。
以下の例では TLS1.0 で通信していることがわかります。

 

参考情報

ServicePointManager Class
https://msdn.microsoft.com/ja-jp/library/system.net.servicepointmanager(v=vs.110).aspx

ServicePointManager.SecurityProtocol Property
https://msdn.microsoft.com/ja-jp/library/system.net.servicepointmanager.securityprotocol(v=vs.110).aspx

SecurityProtocolType Enumeration
https://msdn.microsoft.com/ja-jp/library/system.net.securityprotocoltype(v=vs.110).aspx

今回のブログは以上です。
サポート チーム違いではないかと疑問を持たれた方もいらっしゃるかもしれませんが、Internet Explorer サポート チームでは、.NET Framework の HTTP クライアントや WinHTTP の開発案件も担当しています。

また次回もよろしくお願いいたします。


Comments (2)

  1. Hajime SATO より:

    今回、あるサイトでセキュリティの高いプロトコルが選択されるようサービス提供側のIIS側の対応として、
    レジストリ値を設定、SSL3.0の禁止、TLS1.1の有効化、TLS1.2の有効化を図りました。
    Qualys SSL Labs ( https://www.ssllabs.com/ )を使っての確認は、サイトトップに対して行なわれる
    ようで、アプリケーションに入ってからの通信の状態を再度確認する必要があると認識しました。
    アプリケーションの画面へ遷移して、Chromeの場合、&#35388;明書のアイコンをクリックすると&#35388;明書情報と
    ともにTLSのバージョンの表示で確認できたので、再度、アプリ内の画面を表示してみて、ひとまず
    安心しておりますが、IEの場合でも同じことの確認ができる手段はあるでしょうか?

  2. Hajime SATO 様

    [ファイル] – [プロパティ] メニューから確認できます。
    ブログ記事に追記しましたのでご確認ください。

Skip to main content