it-swarm-ja.com

.NET 4.5のデフォルトのSecurityProtocol

TLS 1.2までをサポートするサーバーと通信するためのデフォルトのセキュリティプロトコルは何ですか?デフォルトで.NET、サーバー側でサポートされている最高のセキュリティプロトコルを選択するか、このコード行を明示的に追加する必要がありますか。

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

コードを変更する以外に、このデフォルトを変更する方法はありますか?

最後に、.NET 4.0TLS 1.0までしかサポートしていませんか? TLS 1.2をサポートするには、クライアントプロジェクトを4.5にアップグレードする必要があります。

私の動機は、サーバーがサポートしていてもクライアント側でSSLv3のサポートを削除すること(私は既にこれをマシンレジストリで無効にするpowershellスクリプトを持っています)とサーバーがサポートする最も高いTLSプロトコルをサポートすることです。

更新: .NET 4.0ServicePointManagerクラスを見るTLS 1.01.1の列挙値がありません。どちらの.NET 4.0/4.5でも、デフォルトはSecurityProtocolType.Tls|SecurityProtocolType.Ssl3です。うまくいけば、このデフォルトはレジストリでSSLv3を無効にしても壊れないでしょう。

しかし、私はすべてのアプリケーションを.NET 4.5にアップグレードし、すべてのアプリケーションのすべてのブートストラップコードに明示的にSecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;を明示的に追加する必要があることに決めました。

これは、さまざまなAPIおよびサービスへのアウトバウンド要求を行い、SSLv3にダウングレードしないようにし、最高レベルのTLSを選択する必要があります。

このアプローチは理にかなっているか、やり過ぎですか。私はアップデートするアプリケーションをたくさん持っています、そしてTLS 1.0さえ近い将来にはいくつかのプロバイダーによって廃止されるかもしれないと聞いているので私は将来それらを証明したいです。

クライアントがAPIに対してアウトバウンドリクエストを行う場合、レジストリでSSL3を無効にしても.NET Frameworkに影響がありますか?デフォルトではTLS 1.1と1.2は有効になっていませんが、レジストリから有効にする必要がありますか? RE http://support.Microsoft.com/kb/245030

ちょっと調べてみましたが、レジストリ設定はIIS(サーバーサブキー)とブラウザ(クライアントサブキー)に適用されるため、影響はありません。

申し訳ありませんが、この投稿は複数の質問にまとめられており、 "おそらく"答えがついています。

214
Luke Hutton

両方の.NET System.Net.ServicePointManager.SecurityProtocolのデフォルトの4.0/4.5SecurityProtocolType.Tls|SecurityProtocolType.Ssl3です。

.NET 4.0は最大TLS 1.0をサポートし、.NET 4.5は最大TLS 1.2をサポートします

ただし、.NET 4.0が同じ環境にインストールされている場合、TLS 1.2をターゲットとするアプリケーションは、.NET 4.5までサポートできます。 .NET 4.5は、.NET 4.0の代わりにSystem.dllの上にインストールされます。

fiddler4でトラフィックに設定されている正しいセキュリティプロトコルを観察し、.NET 4.0プロジェクトの列挙値を手動で設定することでこれを確認しました。

ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;

参照:

namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

.NET 4.0のみがインストールされている環境でハックを試みると、例外が発生します。

未処理の例外:System.NotSupportedException:要求されたセキュリティプロトコルはサポートされていません。 System.Net.ServicePointManager.set_SecurityProtocol(SecurityProtocolType値)

しかし、将来のパッチなどでそれが壊れる可能性があるので、私はこの「ハック」をお勧めしません。*

したがって、私はSSLv3のサポートを削除するための最良の方法は次のとおりです。

  1. すべてのアプリケーションを.NET 4.5にアップグレードします
  2. 次のコードを追加してデフォルトを上書きし、将来的にそれを証明します。

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

*このハックが間違っていれば誰かが私を修正しますが、最初のテストでうまくいくと思います

176
Luke Hutton

コメントを残している人たちの中には、System.Net.ServicePointManager.SecurityProtocolを特定の値に設定すると、将来の.NETの更新でデフォルト値になる可能性がある将来のTLSバージョンをアプリが利用できなくなることを意味します。固定されたプロトコルのリストを指定する代わりに、あなたが代わりにあなたが知っていて気にしているプロトコルをオンまたはオフにして、他のものはそのままにしておくことができます。

他のプロトコルに影響を与えずにTLS 1.1および1.2をオンにするには、以下のようにします。

System.Net.ServicePointManager.SecurityProtocol |= 
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

他のフラグをオフにせずにこれらのフラグをオンにするための|=の使用に注意してください。

他のプロトコルに影響を与えずにSSL3をオフにするには

System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
215
Scott

次のレジストリでデフォルトの動作を上書きできます。

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

そして

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

詳細については、 ServicePointManager の実装を参照してください。

61
Jiri Mares

拡張子が.regで、次の内容のテキストファイルを作成します。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

または以下のソースからダウンロードしてください。

https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg

ダブルクリックしてインストール...

47
dana

私は私がTLS 1.2だけを指定するときそれがまだ1.1にダウンネゴシエートすることを分った。 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.net 4.5 WebアプリケーションのGlobal.asax起動方法でこれを指定しました。

18
Jim

レジストリ変更メカニズムは、闘争の後で私のために働きました。実際、私のアプリケーションは32ビットで動作していました。だから私はパスの下で値を変更する必要がありました。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319

値の型はDWORDで、0より大きい値である必要があります。1を使用してください。Registry settings to get .Net 4.0 app use TLS 1.2 provided .Net 4.5 is installed in the machine.

14

顧客がTLSを1.0から1.2にアップグレードしたときに問題が発生しました。私のアプリケーションは.NET Framework 3.5を使用しており、サーバー上で動作します。だから私はこの方法でそれを修正しました:

  1. プログラムを修正する

HttpWebRequest.GetResponse()を呼び出す前に、次のコマンドを追加してください。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolTypeExtensions.Tls11 | SecurityProtocolTypeExtensions.Tls12;

System.NetとSystem.Security.Authenticationの2つの新しいクラスを追加することにより、2つのDLLを拡張します。

    namespace System.Net
    {
        using System.Security.Authentication;
        public static class SecurityProtocolTypeExtensions
        {
            public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
            public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11;
            public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0;
        }
    } 

    namespace System.Security.Authentication
    {
        public static class SslProtocolsExtensions
        {
            public const SslProtocols Tls12 = (SslProtocols)0x00000C00;
            public const SslProtocols Tls11 = (SslProtocols)0x00000300;
        }
    } 
  1. Microsoftバッチを更新する

バッチをダウンロードする:

  • Windows 2008 R2の場合:windows6.1-kb3154518-x 64.msu
  • Windows 2012 R2の場合:windows8.1-kb3154520-x64.msu

ダウンロードバッチと詳細については、こちらをご覧ください。

https://support.Microsoft.com/ja-jp/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows -7-sp1-and-server-2008-r2-sp1

13
Hieu

次のようなコードになります:

  • 印刷可能プロトコル
  • 利用可能なプロトコルを印刷する
  • プラットフォームでTLS1.2がサポートされていて、それが最初から有効になっていない場合は、TLS1.2を有効にします。
  • sSL3が有効になっている場合は無効にします
  • 印刷結果

定数:

  • 48はSSL3です
  • 192はTLS1です
  • 768はTLS1.1です
  • 3072はTLS1.2です

他のプロトコルは影響を受けません。これはこれを将来のプロトコル(Tls1.3など)と互換性のあるものにします。

コード

// print initial status
    Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion);
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);
    Console.WriteLine("Available protocols: ");
    Boolean platformSupportsTls12 = false;
    foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) {                
        Console.WriteLine(protocol.GetHashCode());
        if (protocol.GetHashCode() == 3072){
            platformSupportsTls12 = true;
        }
    }
    Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072));    


// enable Tls12, if possible
    if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072)){
        if (platformSupportsTls12){
            Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now.");
            ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072;
        } else {
            Console.WriteLine("Platform does not supports Tls12.");
        }
    }

// disable ssl3
   if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3)) { 
      Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now.");
      // disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration.
      System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;                      
   }
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);

出力

Runtime: 4.7.2114.0
Enabled protocols:   Ssl3, Tls
Available protocols: 
0
48
192
768
3072
Is Tls12 enabled: False
Platform supports Tls12, but it is not enabled. Enabling it now.
Ssl3 is enabled. Disabling it now.
Enabled protocols:   Tls, Tls12
10
gerasoras

私は.NET 4.5.2で動いています、そして私はこれらの答えのどれにも満足していませんでした。 TLS 1.2をサポートするシステムと話していて、SSL 3、TLS 1.0、およびTLS 1.1はすべて壊れていて安全ではないと思われるので、これらのプロトコルを有効にしたくありません。 .NET 4.5.2では、SSL3とTLS 1.0の両方のプロトコルがデフォルトで有効になっています。これはServicePointManager.SecurityProtocolを調べることでコード内で確認できます。 .NET 4.7には、プロトコルの選択をOSに明示的に引き渡す新しいSystemDefaultプロトコルモードがあります。ここでは、レジストリやその他のシステム設定に依存することが適切であると考えています。しかし、それは.NET 4.5.2ではサポートされていないようです。将来の互換性のあるコードを書くために、将来TLS1.2がどうしても壊れてしまったり、.NET 4.7+にアップグレードしてOSに適切なプロトコルを選択する責任を引き継いだとしても、正しい決定をし続けるでしょう。 、私は次のコードを採用しました:

SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol;
if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11))
{
    securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
    if (securityProtocols == 0)
    {
        securityProtocols |= SecurityProtocolType.Tls12;
    }
    ServicePointManager.SecurityProtocol = securityProtocols;
}

このコードは、既知の安全でないプロトコルが有効になったことを検出します。この場合は、これらの安全でないプロトコルを削除します。他に明示的なプロトコルが残っていない場合は、現時点で.NETでサポートされている唯一の既知の安全なプロトコルとしてTLS 1.2を有効にします。将来追加されることについて知らない新しいプロトコルタイプを考慮に入れるので、このコードは前方互換性があります、そしてそれはまた私がする必要がないことを意味する.NET 4.7の新しいSystemDefault状態でもうまくいきます。将来このコードを再訪問してください。無条件に特定のセキュリティプロトコルの状態をハードコーディングするのではなく、このようなアプローチを採用することを強くお勧めします。そうしないと、TLS 1.2のときに新しいセキュリティプロトコルにアップグレードするためにクライアントを再コンパイルして新しいバージョンに置き換える必要があります。それは必然的に壊れている、あるいはあなたのサーバー上で何年もの間既存の安全でないプロトコルを有効にしておかなければならないでしょう、あなたの組織を攻撃の標的にするでしょう。

7
Roger Sanders

マイクロソフトは最近、これに関するベストプラクティスを発表しました。 https://docs.Microsoft.com/ja-jp/dotnet/framework/network-programming/tls

概要

.Net Framework 4.7をターゲットにして、SecurityProtocolを設定しているコードをすべて削除すると、OSによって最も安全なソリューションが確実に使用されます。

注意:最新バージョンのTLSがOSでサポートされ有効になっていることも確認する必要があります。

OS                          TLS 1.2 support

Windows 10                  \_ Supported, and enabled by default.
Windows Server 2016         /   
Windows 8.1                 \_ Supported, and enabled by default.
Windows Server 2012 R2      /
Windows 8.0                 \_ Supported, and enabled by default.
Windows Server 2012         /
Windows 7 SP1               \_ Supported, but not enabled by default*.
Windows Server 2008 R2 SP1  /
Windows Server 2008         -  Support for TLS 1.2 and TLS 1.1 requires an update. See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows Vista               -  Not supported.

* To enable TLS1.2 via the registry see https://docs.Microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Server

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Client

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

より多くの情報と古いフレームワークについては、MSリンクを参照してください。

5
JohnLBevan

完全を期すために、前述のレジストリキーを設定するPowershellスクリプトを次に示します。

new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord";
new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"
3
qbik

この問題に対する最善の解決策は、少なくとも.NET 4.6以降にアップグレードすることであると思われます。これにより、強力なプロトコルと強力な暗号が自動的に選択されます。

.NET 4.6にアップグレードできない場合は、設定のアドバイス

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

そしてレジストリ設定を使用します。

HKEY_LOCAL_MACHINE \ソフトウェア\ Microsoft.NETFramework\v4.0.30319 - SchUseStrongCrypto = DWORD of 1 HKEY_LOCAL_MACHINE \ソフトウェア\ Wow6432Node\Microsoft.NETFramework\v4.0.30319 - SchUseStrongCrypto = DWORD 1

TLS 1.0と強力な暗号以外のものを使用することになります。

私のテストでは、Wow6432Nodeの設定のみが違いをもたらしましたが、私のテストアプリケーションはAny CPU用に構築されていました。

2
G W C

ハードコーディングされたServicePointManager.SecurityProtocolまたは明示的な SchUseStrongCrypto キーの代わりに上記のように:
SystemDefaultTlsVersionsキーを使用して、デフォルトのSCHANNEL設定を使用するように.NETに指示できます。
例えば。:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
2
Alfred