与支持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协议。

更新: 查看。net 4.0中的ServicePointManager类,我没有看到TLS 1.0和1.1的枚举值。在这两个。net 4.0/4.5中,默认为SecurityProtocolType.Tls|SecurityProtocolType.Ssl3。希望在注册表中禁用SSLv3不会破坏这个默认值。

然而,我决定将所有应用程序升级到。net 4.5,并显式地添加SecurityProtocolType。Tls |安全协议类型。Tls11 | SecurityProtocolType.Tls12;总之,所有应用程序的引导代码。

这将使对各种api和服务的出站请求不降级到SSLv3,并且应该选择最高级别的TLS。

这种方法听起来合理还是过份?我有很多应用程序要更新,我想在未来证明它们,因为我听说在不久的将来,一些提供商可能会弃用TLS 1.0。

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

经过一番研究,我相信注册表设置不会有任何影响,因为它们适用于IIS(服务器子密钥)和浏览器(客户端子密钥)。

对不起,这篇文章变成了多个问题,然后是“可能”的答案。


当前回答

当我的客户将TLS从1.0升级到1.2时,我遇到了这个问题。 我的应用程序使用。net framework 3.5和运行在服务器上。所以我用这种方法来解决它:

修复程序

在调用HttpWebRequest.GetResponse()之前添加以下命令:

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

通过添加2个新类扩展2个dll: System。网络和系统。安全性。身份验证

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

更新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

其他回答

用于密钥:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319 价值:SchUseStrongCrypto

您必须将该值设置为1。

在经历了一番挣扎之后,注册表更改机制为我工作了。实际上,我的应用程序是32位的。所以我必须改变路径下的值。

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

值类型需要为DWORD且值大于0。最好使用1。

如果您可以使用。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.

这个问题的最佳解决方案似乎是至少升级到。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和强密码以外的东西。

在我的测试中,只有Wow6432Node中的设置有任何不同,尽管我的测试应用程序是为任何CPU构建的。

有两种可能的情况,

如果你的应用程序运行在。net framework 4.5或更低版本上,你可以很容易地将新代码部署到产品中,那么你可以使用下面的解决方案。 你可以在调用api之前添加下面的代码行, ServicePointManager。SecurityProtocol = SecurityProtocolType.Tls12;// .net 4.5 如果您无法部署新代码,而希望使用生产环境中存在的相同代码进行解析,那么您有两个选择。

方案一:

[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


然后创建一个扩展名为.reg的文件并安装。

注意:此设置将应用于注册表级别,并适用于该机器上的所有应用程序,如果您希望仅限制为单个应用程序,则可以使用选项2

选项2:这可以通过更改配置文件中的一些配置设置来完成。 您可以在配置文件中添加其中任何一个。

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
  </runtime>

or

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>