.NET 4.5のデフォルトのSecurityProtocol


253

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

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

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

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

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

更新:ServicePointManagerクラス.NET 4.0を見るTLS 1.0と、およびの列挙値はありません1.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フレームワークにも影響がありますか?デフォルトでTLS 1.1および1.2が有効になっていないことがわかりました。レジストリを使用して有効にする必要がありますか?RE http://support.microsoft.com/kb/245030

少し調査した結果、レジストリ設定はIIS(サーバーサブキー)とブラウザ(クライアントサブキー)に適用されるため、影響がないと思います。

申し訳ありませんが、この投稿は複数の質問になり、その後「たぶん」の回答が続きました。


FYI:TLSの周りの最新のベストプラクティス:docs.microsoft.com/en-us/dotnet/framework/network-programming/...
JohnLBevan

これに対する最良の答えを見たい人のために、投票で並べ替えてください!
navule

1
関連するSOのQ&A: stackoverflow.com/questions/41618766/… 読者はこの質問が古くなっており、2020
。–返金なし返品不可

回答:


280

コメントを残している人の一部は、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;

6
これが正解です。承認された回答により、戻ってコードを更新しない限り、アプリは常に新しいTLSバージョンをオフに切り替えます。
コナー2017

5
@Gertsenいいえ、それはビット単位であるか、または適切なビットがオフになっている場合にオンにするだけです。これらのビットがすでにオンになっている場合、変更は発生しません。
スコット

3
そしてこれに相当するPowerShellは、[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12) Invoke-RestMethodが同じ基盤となる.NETフレームワークライブラリに依存していることです。
マーティンホリングスワース2018年

15
このコードの配置場所について誰も話していなかったため、私はASP.NET MVCアプリケーションのGlobal.asax.csのApplication_Startにコードを正常に配置しました。SMTP要求をTLS1.0ではなくTLS1.2で送信する方法を探していました。&=
Greg Veres

2
VBでの同等のNet.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
コードスペース

188

System.Net.ServicePointManager.SecurityProtocol両方の.NET のデフォルト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 v alue)で

ただし、今後のパッチなどで壊れる可能性があるため、この「ハック」はお勧めしません。*

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

  1. すべてのアプリケーションを .NET 4.5
  2. 次のコードをブーストラッピングコードに追加して、デフォルトをオーバーライドし、それを将来的に検証します。

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

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


6
imperialviolet.org/2014/12/08/poodleagain.htmlを参照してください。「これは、AEAD暗号スイートを使用したTLS 1.2未満のすべてが暗号的に破壊されていることを改めて表明する良い機会のようです。」
2015

3
@Mathew、のソースコードを見てServicePointManager.csreferencesource.microsoft.com/#System/net/System/Net/...
ルーク・ハットン

12
私は人々.NET 4.5がTls12 のデフォルトを主張しているのを見続けていますが、ここで説明したように、そうではありません。それはあなたのためにそれを使用するオプション提供しますSecurityProtocol
ドン・チードル

17
この回答には多くの有用な情報が含まれているので、私は反対票を投じませんが、ハードコードされたプロトコルバージョンを実装すると、アプリケーションが利用可能な最良の暗号化を使用できなくなり、将来的にセキュリティの問題が発生する可能性があるため、お勧めできません。レジストリを変更して、.Netのデフォルトの動作を変更し、最新のプロトコルを実際にサポートすることをお勧めします。(ただし、レジストリの変更によりSSL v3も無効になることに注意してください。)
AJヘンダーソン

6
FW 4.6と4.7で、デフォルトは今あるSecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12ごとにsupport.microsoft.com/en-us/help/3069494/...
イアン・ケンプ

68

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

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を参照してください。


ありがとう、私はこれについて知りませんでした。私はそれをテストします。私はそれを設定するpowershelスクリプトを作成しました:gist.github.com/lukehutton/ab80d207172a923401b1
Luke Hutton、

6
レジストリの変更は良い解決策のようには見えません。アプリケーションがTLS1をサポートしたい場合、アプリケーションはTLS1を考慮に入れる必要があります。実行環境ではありません。それ以外の場合は、他のアプリケーションに害を及ぼしたり、アプリケーションのデプロイとアップグレードが困難になる可能性があります。
ミハイルG

13
@MikhailGはかなり反対です。レジストリの変更は望ましい方法です。SChannelは、基礎となるネゴシエーションの抽象化を提供します。サポートされている最高のセキュリティレベルが何であれ、アプリケーションで使用する必要があります。ソフトウェアで人為的に制限すると、新しいプロトコルがリリースされ、ソフトウェアがそれらを使用できなくなると、将来問題が発生します。ソフトウェアで特定のプロトコルよりも優れた使用のみを行うオプションがあると便利ですが、将来のバージョンが機能しないようにすることなく、そのオプションはありません。...しかし、その変化に対応しました無効SSL v3の
AJヘンダーソン

13
コマンドライン:(reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64および/または/reg:32
Kevin Smyth 2016年

7
@MikhailG:レジストリを設定しても、アプリケーションが古いプロトコルをサポートすることは妨げられません。デフォルトのみを変更します(現時点ではtls 1.0を含みます)。さらに、.Net 4.6以降のデフォルトの動作では、強力な暗号化を使用します。その場合、このレジストリエントリは強力な暗号を無効にする手段としてのみ役立ちます。
Brian

51

.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

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


3
指定したリンクにはSSL証明書の問題があるようです。
NathanAldenSr

これらのレジストリキーを追加しても、まだ問題があります。何か案が ?
Samidjo

@Samidjo-どの.NETバージョンを使用していますか?ルークの答えは私のものよりはるかに詳細ですが、少なくとも.NET 4.5がインストールされている必要があるようです。また、変更したばかりの場合は、アプリプールをリサイクルする必要がある場合があります。これらは推測の一種であるため、詳細が
わから

2
最近サーバーにパッチsupport.microsoft.com/en-us/help/4019114/…を適用したため、.net 4.5.2アプリケーションがhttps RESTリクエストで失敗しました。これらのキーは私たちの問題を解決しました。
Kleinux 2017

21

TLS 1.2のみを指定した場合でも、1.1にダウンネゴシエートすることがわかりました。 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.net 4.5 WebアプリのGlobal.asax起動メソッドでこれを指定しました。


2
サーバーでサポートされているセキュリティプロトコルは何ですか?これもここでの要因であり、サーバーの最新バージョンは1.1である可能性があります。www.passionatecoder.ca
Ehsan

14
これは、ソリューションであるコード行をどこに置くかを示す唯一の回答であるため、賛成です。
jgerman 2016年

1
クライアント(C#WebClientなど)とサーバー(呼び出すAPIサーバー)は、両方がサポートする最高のプロトコルを使用するようにネゴシエートします。したがって、クライアントがTLS 1.2をサポートし、サーバーはTLS 1.1のみをサポートしている場合-クライアントはTLS 1.1を使用します(クライアントからTLS 1.1を削除しない限り-この場合、相互にサポートされているプロトコルが見つからず、クライアントはエラーになります)
ドンチードル

Global.asax.csでSystem.Netを使用して追加する必要がありました
Patrick

16

次のコードは:

  • 印刷対応プロトコル
  • 利用可能なプロトコルを印刷する
  • プラットフォームが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

14

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

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

HttpWebRequest.GetResponse()を呼び出す前に、次のコマンドを追加します。

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

2つの新しいクラスを追加することによる拡張2 DLL:System.NetおよびSystem.Security.Authentication

    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-x64.msu
  • Windows 2012 R2の場合:windows8.1-kb3154520-x64.msu

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

https://support.microsoft.com/en-us/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


1
ソースコードを変更せずにSecurityProtocolを変更することは可能ですか?machine.configやapp.configのように。
アハンケンディ

1
ワオ。それが今年のブードゥー賞です。あなたは郊外を揺るがす!
granadaCoder 2018

14

レジストリの変更メカニズムは、私にとって苦労してうまくいきました。実際、私のアプリケーションは32ビットとして実行されていました。したがって、パスの下の値を変更する必要がありました。

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

値のタイプはDWORDで、0より大きい値である必要があります。1を使用することをお勧めします。.Net 4.0アプリを取得するためのレジストリ設定は、TLS 1.2提供の.NET 4.5がマシンにインストールされていることを使用します。


正確ではありません。.NET 4.5.2では、これを1(またはそれ以上)に設定する必要があります。ただし、.NET 4.6の場合は、0に設定しないことで十分です(つまり、設定解除できます)。
Jirka Hanika、2015

ああ、私は.Net 4.6でテストしていません。私の調査結果はブログ投稿joymonscode.blogspot.com/2015/08/…にあります
Joy George Kunjikkuru

言及するレジストリキーは、「Wow6432Node」になっているはずです。何らかの理由で「ノード」部分を省略しました。回答を編集しようとしましたが、変更が4文字しかなかったため、許可されませんでした。:\
Jeffrey LeCours

この設定をデフォルトとしてアクティブにするには、IISをバウンスする必要がありました。
ジェフミッチェル

10

私は.NET 4.5.2で実行していますが、これらの答えのどれにも満足できませんでした。私がTLS 1.2をサポートするシステムと話していると、SSL3、TLS 1.0、およびTLS 1.1はすべて壊れており、使用するには安全ではないため、これらのプロトコルを有効にしたくありません。.NET 4.5.2では、SSL3とTLS 1.0の両方のプロトコルがデフォルトで有効になっています。これを調べると、コードで確認できますServicePointManager.SecurityProtocol。.NET 4.7では、新しいSystemDefaultプロトコルの選択をOSに明示的に渡すプロトコルモード。レジストリやその他のシステム構成設定に依存するのが適切だと思います。ただし、.NET 4.5.2ではサポートされていないようです。前方互換性のあるコードを作成するために、将来的にTLS 1.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を強制的に有効にします。このコードは、将来追加されるかどうかわからない新しいプロトコルタイプを考慮に入れるため、上位互換性があり、新しいコードでもうまく機能します。SystemDefault.NET 4.7の状態。つまり、将来このコードを再確認する必要はありません。特定のセキュリティプロトコルの状態を無条件にハードコーディングするのではなく、このようなアプローチを採用することを強くお勧めします。そうしないと、TLS 1.2のときに新しいセキュリティプロトコルにアップグレードするために、クライアントを再コンパイルして新しいバージョンに置き換える必要があります。は必然的に壊れているか、サーバー上で既存の安全でないプロトコルを何年もオンにしておかなければならない可能性が高く、組織が攻撃の標的になっています。


1
この回答は最もよく考えられているように見えますが、何かを見落とさない限り、TLS 1.2が必然的に壊れた場合は常に前方互換性があるかどうかはわかりません。私の.NET 4.7.2アプリで見たものから、SecurityProtocolType.SystemDefaultフラグはに評価される0ためif (securityProtocols == 0)、TLS 1.2のビット単位の包含またはフラグを使用してチェックすると、「ブレーク」した後でも、常にTLS 1.2が含まれます。ここでは鋭い撮影ではありません。私は本当に最善の道を模索しています。
Griswald_911 2018

これを含めるようにコードを変更しましたが、機能し、上位互換性があるようです:if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
Griswald_911 2018

@ Griswald_911、4.7.2コンソールアプリケーションに同様のコードがあり、この行securityProtocols |= SecurityProtocolType.Tls12;(ifブロックなし)がSystemDefaultを維持していないことがわかりました。その後、securityProtocolsにはTLS2しかありません。値がSystemDefaultの場合、値を更新する必要はありませんか?上位互換性について、TLS 1.3のような新しいプロトコルをOSが有効にすることを想定していますか?
ヤン、

@ヤン-正解。securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the SecurityProtocolType`列挙型の行に[Flags]属性があり、SystemDefault列挙値がの0場合、以前に設定されていても、SystemDefault値は削除されます。結果として、SevicePointManager.SecurityProtocol を0に設定するか、他の列挙値の任意の組み合わせに設定できます。これをSystemDefaultに設定すると、基本的に自分でプロトコルを指定せず、OSに決定させることになります。
Griswald_911

1
@Yang-重要なのは、値をSystemDefaultに設定した後、アプリはOSが指定するものすべてを使用する必要があるということです-Windows 10の最新バージョンではTLS 1.2です。標準では、その機能を継承するためにアプリケーションを変更する必要はありません。ここのドキュメントを参照してください。SystemDefaultは、「オペレーティングシステムが使用する最適なプロトコルを選択し、安全でないプロトコルをブロックできるようにします」。
Griswald_911

6

マイクロソフトは最近、これに関するベストプラクティスを公開しました。 https://docs.microsoft.com/en-us/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リンクを参照してください。


3
問題は、ガイドラインに従う(SecurityProtocolType.SystemDefaultを維持する)場合、レジストリを変更せずにこれらのOSで「有効」になっていないため、tls 1.1およびtls 1.2がWindows 7およびServer 2008で機能しないことです。これにより、実際にはSystemDefaultが仕様上無効になります。マイクロソフトは本当にこれを台無しにした。
osexpert

いいですね、@ osexpertに感謝します。サポートされているOSに関する情報を含めるように回答を修正したので、4.7を対象とするだけでは十分ではない古いOSを実行している人にとっても驚きはありません。
JohnLBevan

1
また、いくつかのOS上での新しいプロトコルを有効にするには、KBあります:NB support.microsoft.com/en-my/help/3140245/...
JohnLBevan

1
:レジストリ設定はオプションで、私は、これは.NET 4.7+のための最善の解決策だと思うしていない場合 if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
osexpert

5

完全を期すために、前述のレジストリキーを設定する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"

2

上記のハードコーディング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

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

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

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

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

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 – SchUseStrongCrypto = 1のDWORD HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 – SchUseStrongCrypto = 1のDWORD

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

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


説明:SevicePointManager.SecurityProtocolを設定するか、レジストリ設定を設定するだけです。両方を行う必要はありません。私のアプリケーションでは、ServicePointManager.SecurityProtocolを設定することにしました。レジストリの設定はマシン全体に影響し、TLS 1.0に依存しているため、他の誰かのアプリケーションを壊したくありませんでした。
GWC、

1

.NET Frameworkでのトランスポート層セキュリティ(TLS)のベストプラクティスによると: .NET Frameworkアプリケーションを安全に保つには、TLSバージョンをハードコーディングしないでください。代わりに、レジストリキーを設定しますSystemDefaultTlsVersions SchUseStrongCrypto

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

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

0

.NET 4.7.1以降を使用できる場合、オペレーティングシステムの機能に基づいた最小プロトコルとしてTLS 1.2を使用します。マイクロソフトの推奨によると:

To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.

-2

キーの場合:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319値:SchUseStrongCrypto

値を1に設定する必要があります。


5
私はその同じ答え@Jiraマレスが提供するので、あなたは、あまり詳細で、downvotedなっていると思う
スチュアートまちがいを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.