.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.01.1。两者.NET 4.0/4.5的默认值为SecurityProtocolType.Tls|SecurityProtocolType.Ssl3。希望此默认设置不会因禁用SSLv3注册表而中断。

但是,我已经决定必须将所有应用程序升级到所有应用程序的所有引导代码,.NET 4.5并明确添加SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;它们。

这将向各种api和服务发出出站请求,而不会降级到api,SSLv3因此应选择的最高级别TLS

这种方法听起来合理还是过度?我有许多应用程序需要更新,我想对它们进行将来的验证,因为我听说TLS 1.0某些提供商甚至可能会在不久的将来弃用这些应用程序。

作为客户端向API发出出站请求时,在注册表中禁用SSL3甚至会对.NET框架产生影响吗?我看到默认情况下未启用TLS 1.1和1.2,我们是否必须通过注册表启用它?RE http://support.microsoft.com/kb/245030

经过一番调查,我认为注册表设置不会有任何影响,因为它们适用于IIS(服务器子项)和浏览器(客户端子项)。

抱歉,该帖子变成了多个问题,随后给出了“也许”答案。



对于那些希望为此找到最佳答案的人,请按票数排序!
navule

1
相关的SO问答: stackoverflow.com/questions/41618766/… 读者应注意,这个问题正在老龄化,并且到2020
不退款

Answers:


280

一些发表评论的人指出,设置System.Net.ServicePointManager.SecurityProtocol为特定值意味着您的应用程序将无法利用将来的TLS版本,后者可能会成为.NET未来更新中的默认值。您无需指定固定的协议列表,而可以打开或关闭您知道和关心的协议,而不必保留其他任何协议。

要打开TLS 1.1和1.2而不影响其他协议:

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

注意使用|=来打开这些标志而不关闭其他标志。

要关闭SSL3而不影响其他协议:

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

6
这是真正正确的答案。接受的答案将确保您的应用程序始终关闭新的TLS版本,除非您返回并更新代码。
康纳

5
@Gertsen不,这是按位的,因此,如果它们处于关闭状态,它只会打开相应的位。如果这些位已经打开,则不会发生任何变化。
斯科特(Scott)

3
与PowerShell等效的是[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12) Invoke-RestMethod依赖于相同的基础.NET框架库。
Martin Hollingsworth

15
由于没有人在谈论将此代码放在何处,因此我成功地将其放入ASP.NET MVC应用程序的Global.asax.cs的Application_Start中。我一直在寻找如何使SMTP请求通过TLS1.2而不是通过TLS1.0发送的方法。我还添加了&=
〜SecurityProtocolType.Tls

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.5值为SecurityProtocolType.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值)

但是,我不建议您使用此“ hack”,因为将来的补丁等可能会破坏它。*

因此,我决定取消支持的最佳方法SSLv3是:

  1. 将所有应用程序升级到 .NET 4.5
  2. 在boostrapping代码中添加以下内容,以覆盖其默认值和将来的证明:

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

*如果此hack是错误的,请有人纠正我,但是我认为初步测试是有效的


6
请参阅imperialviolet.org/2014/12/08/poodleagain.html “这似乎是一个很好的时机,重申除TLS 1.2和AEAD密码套件以外的所有内容都已加密破解。”
尼尔

3
@Mathew,通过查看的源代码ServicePointManager.cs看到referencesource.microsoft.com/#System/net/System/Net/...
卢克哈顿

12
我一直看到人们声称.NET 4.5Tls12 为默认值-但正如您在此处所说的那样,事实并非如此。它使您可以选择将其用于SecurityProtocol
唐·奇德尔

17
我不会拒绝这个答案,因为它确实提供了很多有用的信息,但是实现硬编码协议版本不是一个好主意,因为它将限制应用程序使用最佳可用加密,并且可能会导致安全问题。更改注册表以更改.Net的默认行为以实际支持现代协议是非常可取的。(但是,值得注意的是,注册表更改也禁用了SSL v3。)
AJ Henderson

6
在FW 4.6和4.7,默认的是现在SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12support.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


谢谢,我对此一无所知。我会测试一下。我创建了一个强力
Luke Hutton

6
更改注册表似乎不是一个好的解决方案。如果应用程序要支持TLS1,则应用程序应对此进行分类。不是运行环境。否则,它可能会损害其他应用程序或使您的应用程序部署和升级陷入困境。
Mikhail 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
凯文·史密斯

7
@MikhailG:设置注册表不会阻止应用程序支持较旧的协议。它仅更改默认值(截至目前包括tls 1.0)。此外,.Net 4.6+中的默认行为是使用强加密。在这种情况下,此注册表项仅可用作禁用强加密的手段。
布赖恩

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 '16

@Samidjo-您使用的是哪个.NET版本?卢克(Luke)的答案比我的答案要详细得多,但是看来您至少需要安装.NET 4.5。另外,如果您刚刚进行了更改,则可能必须回收应用程序池。这些都是猜测,因此,如果没有更多细节,我可能可以提供更多帮助:)
dana

2
最近对服务器应用的补丁support.microsoft.com/en-us/help/4019114/…导致我们的.net 4.5.2应用程序在https REST请求上失败。这些键解决了我们的问题。
Kleinux

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
赞成,因为这是唯一表明将WHERE放在解决方案代码行中的答案。
jgerman '16

1
客户端(例如您的C#WebClient)和服务器(您正在调用的API服务器)将协商使用双方都支持的最高协议。所以,如果您的客户端支持TLS 1.2,但服务器只TLS 1.1 -客户端将使用TLS 1.1(除非你从你的客户端删除TLS 1.1 -在这种情况下,他们可能无法找到一个互相支持的协议和客户端将错误)
唐Cheadle

必须在global.asax.cs中使用System.Net进行添加
Patrick

16

以下代码将:

  • 启用打印的协议
  • 打印可用协议
  • 如果平台支持TLS1.2,并且未启用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/zh-CN/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-和服务器-2008-r2-sp1


1
是否可以在不更改源代码的情况下更改SecurityProtocol?例如machine.config或app.config。
ahankendi

1
哇。那是年度伏都教奖。你摇滚郊区!
granadaCoder

14

奋斗之后,注册表更改机制为我工作。实际上,我的应用程序以32位运行。因此,我不得不更改path下的值。

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

值类型必须为DWORD,且值必须大于0。最好使用1。如果在计算机中安装了.Net 4.5,则获取.Net 4.0应用程序的注册表设置将使用TLS 1.2。


这不准确。对于.NET 4.5.2,此值必须设置为1(或更高);但对于.NET 4.6,它可以不设置为0(即可以不设置)。
Jirka Hanika

哦,我没有在.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+并将更多的责任移交给操作系统时,也将继续做出正确的决定。 ,我采用了以下代码:

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;
}

该代码将检测何时启用了已知的不安全协议,在这种情况下,我们将删除这些不安全协议。如果没有其他显式协议,则我们将强制启用TLS 1.2,这是目前.NET支持的唯一已知安全协议。该代码是前向兼容的,因为它将考虑将来不知道要添加的新协议类型,并且也可以与新协议兼容SystemDefaultNET 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 '18

我已经修改了您的代码以包含此代码,它似乎可以正常工作并向前兼容:if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
Griswald_911 '18

@ Griswald_911,我在4.7.2控制台应用程序中有类似的代码,我发现这一行securityProtocols |= SecurityProtocolType.Tls12;(如果没有阻止的话)不维护SystemDefault,之后的securityProtocols仅具有TLS2。那么,您的意思是当value为SystemDefault时,不应该更新任何值吗?关于前向兼容,您是否假设操作系统将负责启用诸如TLS 1.3之类的更新协议?

@杨-正确。行securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the SecurityProtocolType`枚举具有[Flags]属性,并且SystemDefault枚举值是0,即使先前已设置,也会剥离SystemDefault值。最终结果是您可以将设置SevicePointManager.SecurityProtocol 为0,也可以将其设置为其他枚举值的任意组合。如果将其设置为SystemDefault,则基本上是选择自己指定协议,然后由操作系统决定。
Griswald_911 '18

1
@Yang-关键是,将值设置为SystemDefault之后,您的应用应使用操作系统指定的任何功能-在最新版本的Windows 10中为TLS 1.2。想法是,将来TLS 1.3成为标准,您不必修改应用程序即可继承该功能。请参阅此处的文档,其中SystemDefault“允许操作系统选择要使用的最佳协议,并阻止不安全的协议”。
Griswald_911 '18

6

Microsoft最近发布了有关此问题的最佳实践。 https://docs.microsoft.com/zh-cn/dotnet/framework/network-programming/tls

摘要

目标.Net Framework 4.7,删除所有设置SecurityProtocol的代码,因此操作系统将确保您使用最安全的解决方案。

注意:您还需要确保操作系统上支持并启用了最新版本的TLS。

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),则tls 1.1和tls 1.2在Windows 7和Server 2008上将无法运行,因为在未更改注册表的情况下,这些os中未对它们进行“启用”(无论如何)。这实际上使SystemDefault被设计破坏了。微软真的搞砸了这一件事。
osexpert

很好,谢谢@osexpert,赶上。我已经修改了答案,以包含有关支持的操作系统的信息,因此对于运行旧版操作系统的人来说,仅以4.7为目标还不够,这不足为奇。
JohnLBevan '18年

1
注意:还有一个KB可以在某些操作系统上启用更新的协议: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密钥的替代方法:
您可以告诉.NET将默认的SCHANNEL设置与SystemDefaultTlsVersions密钥一起使用,
例如:

[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 = DWORD为1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 – SchUseStrongCrypto = DWORD为1

结果使用的不是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作为最低协议。根据Microsoft的建议:

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 Mares提供的答案相同,但细节较少
Stuart Siegler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.