【问题标题】:How to enable TLS 1.2 for API call in ASP.NET 2.0 application?如何为 ASP.NET 2.0 应用程序中的 API 调用启用 TLS 1.2?
【发布时间】:2017-06-11 07:32:46
【问题描述】:

我们的 ASP.NET 2.0 网站通过调用 Authorize.Net 的 API 来处理信用卡交易。 Authorize 已通知我们,在某个特定日期(即将公布),我们的客户端必须使用 TLS 1.2 协议进行 API 调用。

Microsoft 似乎在这篇 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 和1.2.

我已通过以下步骤实施并测试了我对知识库文章中指出的解决方案的理解:

  1. 在我们的 Windows Server 2008 R2 Web 服务器上启用了 TLS 1.2(并通过 ssllabs.com 确认)。
  2. 确认 SP2 实际上是为 .NET 框架 2.0 版安装的。
  3. 将引用的知识库文章中显示的两个源文件添加到我们的项目中(即 SecurityProtocolTypeExtensions.cs 和 SslProtocolsExtensions.cs)
  4. 在 API 调用上方的项目中输入以下代码行(来自知识库文章):System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolTypeExtensions.Tls12;

不幸的是,在运行应用程序时,我在上面#3 所示的代码行中遇到以下错误:

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

在这一点上,我很难过。我特别感谢有关如何推进此解决方案的任何见解,但我有兴趣了解您知道的任何其他方法,以允许来自 ASP.NET 2.0 应用程序的 API 调用利用 TLS 1.2。 (升级到 .NET 框架的更新版本是最后的手段。)

提前感谢您的帮助!

【问题讨论】:

    标签: asp.net asp.net-2.0 authorize.net tls1.2


    【解决方案1】:

    AS TLS 1.2 不支持 asp.net 2.0。 有一种替代方法可以实现 TLS 1.2,而无需将项目从 asp.net 2.0 迁移到最新/更高版本。步骤如下:

    1. 在 asp.net 更高版本中创建一个新的单独项目。
    2. 添加新的 Web Service 或 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,
        }
    }
    

    【讨论】:

      【解决方案2】:

      我意识到这个问题有点老了——但为了其他人的帮助,这对我们有用——我们的 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 的回答,this link 做到了——专门为我们基于 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 的条目 - 但仅此一项并不能解决问题。

      【讨论】:

        【解决方案3】:

        我们必须使用 .NET 2.0 应用迁移到 TLS 1.2,并且我们不想将代码移植到 .NET 4.5/4.6。经过几天的研究和看到这篇文章后,我们找到了解决方案。这篇文章引用了错误的 HOTFIX。要让 TLS 1.2 在 Server 2008 R2 上为 .NET 2.0 工作,您需要这个 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

        希望对你有帮助

        【讨论】:

        • 如果有人像我一样需要它,这个解决方案在 2020 年仍然有效 :)
        【解决方案4】:

        对于找到此线程的任何其他人,我能够使用上面原始问题中详述的相同步骤 (#1-#4) 让 TLS 1.2 在 .Net 3.5 上运行。一旦我将补丁应用到 Win 2012 服务器(我的共享托管公司已经很好地应用了),然后在我的 API 调用之前添加了启用 TLS 1.2 的代码行,它立即工作:

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

        【讨论】:

        猜你喜欢
        • 2016-06-26
        • 1970-01-01
        • 2018-12-23
        • 2018-08-30
        • 2020-12-06
        • 2019-08-03
        • 1970-01-01
        • 2018-10-13
        • 2019-06-06
        相关资源
        最近更新 更多