it-swarm.com.de

Client und Server können nicht kommunizieren, da sie keinen gemeinsamen Algorithmus besitzen

Ich habe ein Problem mit einem C # PayTrace-Gateway. Der folgende Code funktionierte bis gestern, als ich glaube, dass SSL3 aufgrund des Poodle-Exploits deaktiviert wurde. Beim Ausführen des folgenden Codes haben wir die folgende Meldung erhalten. Der Remote-Server hat die Verbindung zwangsweise beendet. Nachdem wir uns eingehend mit dem Problem befasst hatten, stellten wir fest, dass auf unserem IIS Server 7.5 weiterhin SSL3 verwendet wurde. C # hatte standardmäßig SSL3, wodurch PayTrace die Verbindung zwangsweise beendet. Wir haben dann SSL3 vom Server entfernt. Was dann zu folgendem Fehler führt: 

Der Client und der Server können nicht kommunizieren, da sie keinen gemeinsamen Algorithmus besitzen.  

Ich schätze, dass es zusätzliche SSL-Algorithmen gibt, die auf dem Server installiert werden müssen, nachdem SSL 3 entfernt wurde. Unsere IT-Mitarbeiter behaupten, dass TLS 1.1 und TLS 1.2 funktionieren und dass ASP.NET jetzt standardmäßig verwendet wird. Aber ich habe das Gefühl, dass es noch etwas anderes geben muss, das wir auf dem Server installieren müssen. Ich habe keine Kenntnis von SSL-Algorithmen, daher habe ich keine Ahnung, wo ich anfangen soll. 

var postUrl = new StringBuilder();

//Initialize url with configuration and parameter values...
postUrl.AppendFormat("UN~{0}|", this.MerchantLoginID);
postUrl.AppendFormat("PSWD~{0}|", this.MerchantTransactionKey);
postUrl.Append("TERMS~Y|METHOD~ProcessTranx|TRANXTYPE~Sale|"); 
postUrl.AppendFormat("CC~{0}|", cardNumber);
postUrl.AppendFormat("EXPMNTH~{0}|", expirationMonth.PadLeft(2, '0'));
postUrl.AppendFormat("EXPYR~{0}|", expirationYear);
postUrl.AppendFormat("AMOUNT~{0}|", transactionAmount);
postUrl.AppendFormat("BADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("BADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("BCITY~{0}|", this.City);
postUrl.AppendFormat("BSTATE~{0}|", this.State);
postUrl.AppendFormat("BZIP~{0}|", this.Zip);
postUrl.AppendFormat("SADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("SADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("SCITY~{0}|", this.City);
postUrl.AppendFormat("SSTATE~{0}|", this.State);
postUrl.AppendFormat("SZIP~{0}|", this.Zip);
if (!String.IsNullOrEmpty(this.Country))
{
    postUrl.AppendFormat("BCOUNTRY~{0}|", this.Country);
}
if (!String.IsNullOrEmpty(this.Description))
{
    postUrl.AppendFormat("DESCRIPTION~{0}|", this.Description);
}
if (!String.IsNullOrEmpty(this.InvoiceNumber))
{
    postUrl.AppendFormat("INVOICE~{0}|", this.InvoiceNumber);
}
if (this.IsTestMode)
{
    postUrl.AppendFormat("TEST~Y|");
}

//postUrl.Append();

WebClient wClient = new WebClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
String sRequest = "PARMLIST=" + Url.Encode(postUrl.ToString());
wClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
string sResponse = "";
sResponse = wClient.UploadString(PayTraceUrl, sRequest);

Nur zu Ihrer Information. Dieses Problem tritt auch auf, wenn wir eine Verbindung zum First Data E4-Gateway herstellen, sodass es nicht nur eine Frage von PayTrace ist. Meine Vermutung ist, dass, wenn mehr Gateways den Zugriff auf SSL3 deaktivieren, Probleme mit anderen Gateways auftreten, bis dies auf dem Server behoben werden kann. Ich habe auch einige Vorschläge online gefunden, einige haben vorgeschlagen, den folgenden Code direkt vor der ausgehenden Anforderung zu platzieren: 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Leider hat das auch nicht funktioniert, gleicher Fehler. Aus diesem Grund denke ich, dass auf dem IIS7.5-Server noch etwas installiert werden muss. Ich bin mir einfach nicht sicher was. 

28
matwonk

Es gibt jetzt mehrere andere Beiträge zu diesem Thema, die alle auf TLS 1.2 hinweisen. Alles andere ist unsicher.

Sie können dies in .NET 3.5 mit einem Patch tun.
Sie können dies in .NET 4.0 und 4.5 mit einer einzigen Codezeile tun

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0

In .NET 4.6 wird automatisch TLS 1.2 verwendet.

Weitere Informationen finden Sie hier: .NET-Unterstützung für TLS

53
Paul

Dies wurde gelöst. Es stellte sich heraus, dass unsere IT-Mitarbeiter korrekt waren. Sowohl TLS 1.1 als auch TLS 1.2 wurden auf dem Server installiert. Das Problem bestand jedoch darin, dass unsere Websites als ASP.NET 4.0 ausgeführt werden und Sie über ASP.NET 4.5 verfügen, um TLS 1.1 oder TLS 1.2 auszuführen. Um das Problem zu lösen, mussten unsere IT-Mitarbeiter TLS 1.0 wieder aktivieren, um eine Verbindung mit PayTrace zu ermöglichen. 

Kurz gesagt, die Fehlermeldung "Client und Server können nicht kommunizieren, da sie keinen gemeinsamen Algorithmus besitzen", wurde verursacht, weil auf dem Server kein SSL-Protokoll für die Kommunikation mit den Servern von PayTrace verfügbar war. 

6
matwonk

Durch die Aktivierung von TLS 1.0 wurden auch unsere Probleme behoben (nach dem Deaktivieren von SSL v3). (Server 2012 R2 mit ASP.net 4.0-Websiteverarbeitung gegen PPI - Bezahldienste). Dies ist das RegEdit-Skript, mit dem ich alles so eingestellt habe, wie ich es wollte. Wir haben nur SSL v3 für den Client deaktiviert und nicht den Server. Dadurch wurden andere Dinge beschädigt, mit denen wir noch nicht fertig waren. Nachdem wir die Site auf .Net 4.5.2 aktualisiert haben, wird TLS 1.0 wieder deaktiviert.

Dieses Skript aktiviert alle Protokolle, Server und Client außer SSL v3 für den Client.

-Eric Niemiec

(Stellen Sie sicher, dass Sie Ihre Registrierung sichern !!)

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
5
Eric Niemiec

In einer früheren Antwort wurde vorgeschlagen, diese Codezeile für .Net 4.5 zu verwenden:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5

Ich möchte Sie dazu ermutigen, OR diesen Wert in den vorhandenen Werten wie folgt festzulegen:

ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; // .NET 4.5

Wenn Sie die Liste der Werte betrachten, stellen Sie fest, dass es sich um zwei Potenzen handelt. Auf diese Weise funktioniert der Code in der Zukunft, wenn sich beispielsweise TLS 2.0 ändert, weiterhin. 

4
Philly Frank

Obwohl Target Framework of Project 4.7.1 war, wurde in meinem Fall immer noch derselbe Fehler angezeigt. Die Lösung bestand darin, httpRuntime in web.config unter system.web auf 4.7.1 zu ändern.

2
Jack Ryder

Nachdem ich mich tagelang damit beschäftigt hatte, erforderte mein endgültiger Fix für unsere Probleme zwei Dinge.

1) Wir haben diese Codezeile allen unseren .Net-Bibliotheken hinzugefügt, die gebundene API-Aufrufe an andere Anbieter richten, die ebenfalls ihre SSL-Version 3 deaktiviert haben.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; // (.Net 4 and below)

2) Dies sind die endgültigen und vollständigen Registrierungsänderungen, die Sie benötigen, wenn Sie ASP.Net 4.0-Sites ausführen, und müssen nach dem Upgrade auf ASP.Net 4.5 geringfügig geändert werden.

Nach dem Neustart der Server sind alle Probleme beseitigt.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
0
Eric Niemiec

In früheren Antworten wurden einige Registrierungsschlüssel, die möglicherweise nicht vorhanden sind, nicht angezeigt. Sie sind SchUseStrongCrypto, die vorhanden sein müssen, damit die TLS-Protokolle ordnungsgemäß funktionieren.

Nachdem die Registrierungsschlüssel in die Registrierung importiert wurden, sollte es nicht erforderlich sein, Änderungen am Code vorzunehmen 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Nachfolgend sind alle Registrierungsschlüssel und -werte aufgeführt, die für das x64-Windows-Betriebssystem ..__ benötigt werden. Wenn Sie ein 32-Bit-Betriebssystem (x86) haben, entfernen Sie einfach die letzten 2 Zeilen . TLS 1.0 wird vom Registrierungsskript ..__ deaktiviert. Ein Neustart des Betriebssystems ist erforderlich. 

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
0
Mikhail Titov