如何在ASP.NET 2.0应用程序中启用API调用的TLS 1.2?

12
我们的ASP.NET 2.0网站通过调用Authorize.Net的API处理信用卡交易。Authorize已通知我们,在某个特定日期,将宣布我们的客户端必须使用TLS 1.2协议进行API调用。
微软似乎在10-22-16 KB文章中表明已经提供了解决方案:https://support.microsoft.com/en-us/help/3154517/support-for-tls-system-default-versions-included-in-the-.net-framework-2.0-sp2-on-windows-vista-sp2-and-server-2008-sp2 引用如下:

... 我们添加了SslProtocolsExtensions枚举,您可以将其用作设置TLS v1.2、TLS v1.1以及ServicePointManager.SecurityProtocol属性的操作系统默认值的选项,当针对.NET框架版本2.0 SP2时。

请注意,尽管本文标题如此,但上述引用并不指代Windows Vista SP2或Windows 2008 SP2操作系统,因为这些操作系统不支持TLS v1.1和v1.2。
我已根据KB文章所示的解决方案实施并测试了我的理解,具体步骤如下:
  1. 在我们的Windows Server 2008 R2 Web服务器上启用了TLS 1.2(并通过ssllabs.com进行确认)。
  2. 确认实际已安装.NET框架版本2.0的SP2。
  3. 将引用的KB文章中显示的两个源文件(即SecurityProtocolTypeExtensions.cs和SslProtocolsExtensions.cs)添加到我们的项目中。
  4. 在API调用之前,将以下代码插入到项目中:System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolTypeExtensions.Tls12;
很不幸,在运行应用程序时,我在上面第3个显示的代码行遇到以下错误:

System.NotSupportedException: 不支持请求的安全协议。

此时,我感到困惑。特别希望能够得到任何有关如何解决这个问题的见解,但也想了解您是否知道任何其他方法来允许ASP.NET 2.0应用程序的API调用使用TLS 1.2。(升级到更高版本的.NET框架是最后的选择。)
提前感谢您的帮助!
4个回答

17
我们必须将我们的.NET 2.0应用程序迁移到TLS 1.2,并且我们不想将代码移植到.NET 4.5 / 4.6。经过几天的研究并找到了这篇文章后,我们找到了解决方案。这篇文章引用了错误的HOTFIX。要让Server 2008 R2上的.NET 2.0使用TLS 1.2,您需要使用此HOTFIX:https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework。它引用了3.5.1框架,但也适用于2.0框架。安装了热补丁程序后,您可以在服务器上进行注册表更改,如所示,或在应用程序中进行代码更改以直接引用TLS 1.2。 C# ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; VB ServicePointManager.SecurityProtocol = DirectCast(3072, System.Net.SecurityProtocolType); 对于其他操作系统,请查看特洛伊·斯塔尔(Troy Starr)在此处发布的内容:https://community.qualys.com/thread/16917-net-framework。 希望这有所帮助。

1
这个解决方案在2020年仍然有效,如果有人像我一样需要它 :) - vintastic
2022年可用。 - Vaibhav Garg
在我看来,只需要设置这两个注册表键。我不需要安装任何更新,只需要修改注册表。 - undefined

7

对于其他寻找此线程的人,我成功地让TLS 1.2在.NET 3.5上工作了,使用了原始问题中详细介绍的相同步骤(#1-#4)。一旦我在Win 2012服务器上应用了补丁(我的共享主机公司很好心地应用),然后在我的API调用之前添加了启用TLS 1.2的代码行,它就立即起作用:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolTypeExtensions.Tls12;

1
使用带有 .net 3.5 的 VS 2008;在定义常量 Tls12 之前,这对我不起作用。请参阅 https://dev59.com/QVgQ5IYBdhLWcg3wnVR3#44893192。 - D_Bester

1
我知道这个问题有点老了,但是对于其他人的帮助,这对我们很有效 - 我们的Authorize.Net交易现在可以在我们的.NET 2.0 AbleCommerce应用程序上使用TLS 1.2。[看起来生产转换期限已经延长到2018年2月28日]
环境:Windows Server 2008 R2,IIS 7.5,AbleCommerce 7.0.2 build 11659,CommerceBuilder.AuthorizeNet 7.0.9764.0
根据@JoeBoxer上面的答案,此链接解决了问题 - 具体来说,为我们的x64系统设置了两个注册表键(列出的补丁无法安装在我们的盒子上)。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001

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

我们还做了this - 因为我们没有TLS 1.2的条目 - 但仅此并不能解决问题。


0

由于TLS 1.2不支持asp.net 2.0,因此有一种替代方法可以在不将项目从asp.net 2.0迁移到最新/更高版本的情况下实现TLS 1.2。以下是步骤:

  1. 在asp.net更高版本中创建一个新的独立项目。
  2. 添加新的Web服务或WebAPI(稍后我们将在主项目中使用它)。
  3. 在此处编写特定代码并调用需要使用TLS 1.2验证的特定API。
  4. 现在部署此Web服务/WebAPI并在主项目中使用。

以下是示例代码:

[WebMethod]
        public LoginResult TestLogin(string _username, string _password, string _tokenID)
        {
            try
            {
                System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)3072;
                LoginResult _loginResult = new LoginResult();
                _loginResult = _sForceRef.login(_username, _password + _tokenID);
                return _loginResult;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {

            }
        }
Reference
namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接