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

时间:2017-01-25 22:49:00

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

我们的ASP.NET 2.0网站通过调用Authorize.Net的API来处理信用卡交易。授权已告知我们,在确定的日期,我们的客户必须使用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 framework 2.0 SP2 时。

请注意,尽管有这篇文章的标题,上面引用的指的是Windows Vista SP2或Windows 2008 SP2操作系统,因为这些操作系统不支持TLS v1.1和1.2。

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

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

      

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

    此时,我很难过。我特别感谢有关如何推进此解决方案的任何见解,但我有兴趣了解您允许从ASP.NET 2.0应用程序进行API调用以利用TLS的任何其他方法1.2。 (升级到更新版本的.NET框架是最后的选择。)

    提前感谢您的帮助!

4 个答案:

答案 0 :(得分:9)

我们必须使用我们的.NET 2.0应用程序迁移到TLS 1.2,我们并不想将代码移植到.NET 4.5 / 4.6。经过几天的研究和发现这篇文章后,我们找到了解决方案。这篇文章引用了错误的HOTFIX。要在Server 2008 R2上使用TLS 1.2 for .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框架,但ALSO适用于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 :(得分:6)

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

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

答案 2 :(得分: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上面的回答,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 :(得分:0)

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

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