与支持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

其他回答

当我的客户将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

. net 4.0/4.5中默认的System.Net.ServicePointManager.SecurityProtocol是SecurityProtocolType.Tls|SecurityProtocolType.Ssl3。

.NET 4.0支持TLS 1.0, .NET 4.5支持TLS 1.2

然而,如果在相同的环境中安装了。net 4.5,针对. net 4.0的应用程序仍然可以支持TLS 1.2。

我通过观察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的环境中进行黑客攻击,你会得到异常:

未处理异常:系统。NotSupportedException:请求的安全协议不支持。 在System.Net.ServicePointManager。set_SecurityProtocol (SecurityProtocolType v 价值)

然而,我不建议这个“黑客”,因为未来的补丁等可能会打破它

因此,我决定移除对SSLv3的支持的最佳途径是:

将所有应用程序升级到。net 4.5 在boostrapping代码中添加以下代码来覆盖默认值并在未来证明它: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType。Tls |安全协议类型。Tls11 | SecurityProtocolType.Tls12;

*如果这个黑客是错误的,有人纠正我,但初步测试我看到它工作

您可以覆盖以下注册表的默认行为:

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

and

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

有关详细信息,请参见ServicePointManager的实现。

为了完整起见,这里有一个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"

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

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

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