.NET 4.5中的默認SecurityProtocol


5 Answers

其中一些留下的評論指出,將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;
Question

與支持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 ,我的動機是在客戶端移除對SSLv3的支持(我已經有一個PowerShell腳本在機器註冊表中禁用它),並且支持服務器支持的最高TLS協議。

更新:查看.NET 4.0中的ServicePointManager類,我沒有看到TLS 1.01.1枚舉值。 在.NET 4.0/4.5 ,默認值是SecurityProtocolType.Tls|SecurityProtocolType.Ssl3 。 希望這個默認值不會因在註冊表中禁用SSLv3而中斷。

但是,我決定必須將所有應用升級到.NET 4.5並明確添加SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 無論如何,所有應用程序的所有引導代碼。

這將使各種apis和服務的出站請求不降級到SSLv3並應選擇最高級別的TLS

這種方法聽起來合理還是矯枉過正? 我有很多應用程序需要更新,我希望將來能夠證明這些應用程序,因為我聽說即使TLS 1.0可能會在不久的將來被某些提供商棄用。

作為一個向API發出出站請求的客戶端,在註冊表中禁用SSL3甚至會在.NET框架中產生影響? 我發現默認情況下,TLS 1.1和1.2未啟用,我們是否必須通過註冊表啟用它? RE http://support.microsoft.com/kb/245030

經過一番調查,我相信註冊表設置不會有任何影響,因為它們適用於IIS(服務器子鍵)和瀏覽器(客戶端子鍵)。

對不起,這篇文章變成了多個問題,後面跟著“可能”的答案。




創建一個帶有.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

雙擊以安裝...




如上所述對ServicePointManager.SecurityProtocol或顯式的SchUseStrongCrypto鍵進行硬編碼的替代方法:
您可以告訴.NET使用SystemDefaultTlsVersions項的默認SCHANNEL設置,
例如:

[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



For Key:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Value:SchUseStrongCrypto

您必須將該值設置為1。




當我的客戶將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




以下代碼將會:

  • 打印啟用協議
  • 打印可用協議
  • 如果平台支持TLS1.2並且沒有啟用TLS1.2,則啟用TLS1.2
  • 如果已啟用,請禁用SSL3
  • 打印最終結果

其他協議不會受到影響。 這使得它與未來的協議(Tls1.3等)兼容。

        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. Has no negative impact if SSL3 is already disabled
        System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;

        Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);

產量

48-SSL3,192-TLS1,768-TLS1.1,3072-TLS1.2

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



Related