wake-up-neo.com

Aktivieren von TLS 1.2 für den API-Aufruf in der ASP.NET 2.0-Anwendung

Unsere ASP.NET 2.0-Website verarbeitet Kreditkartentransaktionen über Aufrufe der API von Authorize.Net. Authorize hat uns mitgeteilt, dass unser Client must zu einem bestimmten Datum, das bekannt gegeben wird, das TLS 1.2-Protokoll für API-Aufrufe verwendet. 

Microsoft schien darauf hinzuweisen, dass eine Lösung in diesem 10-22-16 KB-Artikel verfügbar ist: https://support.Microsoft.com/en-us/help/3154517/support-for-tls-system-default-versions -in-the-.net-framework-2.0-sp2-on-windows-Vista-sp2-und-server-2008-sp2

... wir haben die SslProtocolsExtensions-Enumeration hinzugefügt, die Sie als Option zum Setzen von TLS v1.2, TLS v1.1 sowie zum Betrieb von .__ verwenden. Systemstandardwerte für die ServicePointManager.SecurityProtocol-Eigenschaft beim Targeting auf .NET Framework Version 2.0 SP2.

Bitte beachten Sie, dass das Zitat trotz des Titels dieses Artikels nicht auf Windows Vista SP2 oder Windows 2008 SP2-Betriebssysteme verweist, da diese Betriebssysteme TLS v1.1 und 1.2 nicht unterstützen.

Ich habe mein Verständnis der im KB-Artikel angegebenen Lösung implementiert und getestet, indem ich die folgenden Schritte durchführte:

  1. TLS 1.2 wurde auf unserem Windows Server 2008 R2-Webserver aktiviert (und über ssllabs.com bestätigt).
  2. Bestätigt, dass SP2 tatsächlich für .NET Framework Version 2.0 installiert wurde.
  3. Die beiden im referenzierten KB-Artikel gezeigten Quelldateien wurden unserem Projekt hinzugefügt (z. B. SecurityProtocolTypeExtensions.cs und SslProtocolsExtensions.cs).
  4. Geben Sie die folgende Codezeile (aus dem KB-Artikel) direkt oberhalb des API-Aufrufs in das Projekt ein: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolTypeExtensions.Tls12;

Leider tritt beim Ausführen der Anwendung der folgende Fehler in der Codezeile auf, die in Artikel 3 oben angezeigt wird: 

System.NotSupportedException: Das angeforderte Sicherheitsprotokoll lautet nicht unterstützt.

An diesem Punkt bin ich verblüfft. Ich bin besonders dankbar für Erkenntnisse, wie Sie mit dieser Lösung voranschreiten können. Ich bin jedoch an weiteren Ansätzen interessiert, die Ihnen bekannt sind, um einen API-Aufruf von einer ASP.NET 2.0-Anwendung aus zuzulassen, um TLS 1.2 zu verwenden. (Ein Upgrade auf eine neuere Version des .NET-Frameworks ist ein letzter Ausweg.)

Vielen Dank im Voraus für Ihre Hilfe!

7
cjo30080

Wir mussten mit unserer .NET 2.0-App auf TLS 1.2 migrieren und wollten den Code nicht nach .NET 4.5/4.6 portieren. Nach ein paar Tagen Forschung und nachdem wir diesen Beitrag gefunden hatten, fanden wir die Lösung. Dieser Beitrag verweist auf den falschen HOTFIX. Damit TLS 1.2 für .NET 2.0 unter Server 2008 R2 funktioniert, benötigen Sie diesen Hotfix: https://support.Microsoft.com/de-de/help/3154518/support-for-tls-system-default-versions- In-the-.net-Framework eingeschlossen

Es verweist auf 3.5.1-Framework, aber ALSO funktioniert für 2.0-Framework. Sobald der Hotfix installiert ist, können Sie entweder Registrierungsänderungen auf dem Server vornehmen, wie angegeben OR, um Codeänderungen in Ihrer App vorzunehmen, die direkt auf TLS 1.2 verweisen.

C # ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072;

VB ServicePointManager.SecurityProtocol = DirectCast (3072, System.Net.SecurityProtocolType)

Weitere Betriebssysteme von Troy Starr finden Sie hier: https://community.qualys.com/thread/16917-net-framework

Hoffe das hilft

9
JoeBoxer

Für alle anderen Benutzer, die diesen Thread finden, konnte ich TLS 1.2 unter .Net 3.5 mit den gleichen Schritten (# 1- # 4) wie in der Originalfrage oben beschrieben zum Laufen bringen. Nachdem ich den Patch auf den Win 2012-Server angewendet hatte (der für mein freigegebenes Hosting-Unternehmen Nizza genug war, um sich zu bewerben) und dann die Codezeile hinzufügten, um TLS 1.2 vor meinem API-Aufruf zu aktivieren, funktionierte es sofort:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolTypeExtensions.Tls12;
5
B-Rad

Mir ist klar, dass diese Frage schon etwas älter ist - aber für die Hilfe anderer hat dies für uns funktioniert - und unsere Authorize.Net-Transaktionen funktionieren jetzt mit TLS 1.2 in unserer .NET 2.0-Anwendung AbleCommerce. [Anscheinend wurde die Übergangsfrist für die Produktion bis zum 28. Februar 2018 verlängert.]

Umgebung: Windows Server 2008 R2, IIS 7.5, AbleCommerce 7.0.2, Build 11659, CommerceBuilder.AuthorizeNet 7.0.9764.0

Wie oben in der Antwort von @ JoeBoxer beschrieben, hat dieser Link den Trick ausgeführt - insbesondere das Festlegen der zwei Registrierungsschlüssel für unser x64-basiertes System (der aufgeführte Patch würde auf unserer Box nicht installiert werden):

[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 

Wir haben auch this - da wir die Einträge für TLS 1.2 nicht hatten - aber das Problem wurde dadurch nicht behoben.

1
rktect

AS TLS 1.2 unterstützt asp.net 2.0 nicht. Es gibt eine alternative Möglichkeit, TLS 1.2 zu implementieren, ohne das Projekt von asp.net 2.0 auf die neueste/höhere Version zu migrieren. Es folgen die Schritte:

  1. Erstellen Sie ein neues separates Projekt in der höheren Version von asp.net.
  2. Fügen Sie einen neuen Webdienst oder eine neue WebAPI hinzu (später werden wir sie im Hauptprojekt verwenden).
  3. Notieren Sie sich hier einen bestimmten Code und rufen Sie eine bestimmte API auf, die mit TLS 1.2 validiert werden muss.
  4. Stellen Sie diesen Webdienst/diese WebAPI jetzt bereit und verwenden Sie sie im Hauptprojekt.

Unten ist Beispielcode:

[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,
    }
}
0
Raj