2014-11-04 39 views
13

Ho un problema con un gateway PayTrace C#. Il codice seguente funzionava bene fino a ieri, quando ritengo che abbiano disattivato SSL3 a causa del Poodle Exploit. Quando si esegue il codice qui sotto abbiamo ricevuto il seguente messaggio. Il server remoto ha forzatamente chiuso la connessione. Dopo aver fatto alcune ricerche sul problema, abbiamo stabilito che, poiché il nostro IIS Server 7.5 era configurato per utilizzare ancora SSL3, C# era impostato su SSL3, che PayTrace chiudeva forzatamente la connessione. Abbiamo quindi rimosso SSL3 dal server. Che quindi portano al seguente errore:Il client e il server non possono comunicare, perché non possiedono un algoritmo comune

Il client e il server non possono comunicare, perché non possiedono un algoritmo comune.

Suppongo che ci sia un algoritmo SSL aggiuntivo che dobbiamo installare sul server ora che SSL 3 è stato rimosso. Il nostro staff IT afferma che TLS 1.1 e TLS 1.2 funzionano e che ASP.NET dovrebbe essere ora predefinito per tali. Ma sento che ci deve ancora essere qualcos'altro che dobbiamo installare sul server, non ho conoscenza degli algoritmi SSL quindi non ho idea da dove cominciare.

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); 

Inoltre, solo una cronaca, questo problema si verifica anche quando ci colleghiamo a First Data E4 gateway in modo che non è solo una cosa PayTrace. La mia ipotesi è che mentre più gateway disattivano l'accesso a SSL3 continueremo a incorrere in problemi con altri gateway finché questo non può essere risolto sul server. Inoltre, ho trovato alcuni suggerimenti on-line, alcuni suggerito inserendo il seguente codice giusto prima di effettuare la richiesta in uscita:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 

Purtroppo che non ha funzionato neanche, lo stesso errore. Ecco perché sto pensando che qualcosa di aggiuntivo debba essere installato sul server IIS7.5. Non sono sicuro di cosa.

+0

Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

risposta

5

Questo è stato risolto. Si scopre che il nostro staff IT era corretto. Sia TLS 1.1 che TLS 1.2 sono stati installati sul server. Tuttavia, il problema era che i nostri siti sono in esecuzione come ASP.NET 4.0 e devi avere ASP.NET 4.5 per eseguire TLS 1.1 o TLS 1.2. Pertanto, per risolvere il problema, il nostro staff IT ha dovuto riattivare TLS 1.0 per consentire una connessione con PayTrace.

Quindi, in breve, il messaggio di errore "il client e il server non possono comunicare perché non dispongono di un algoritmo comune" è stato causato dal fatto che sul server non era disponibile alcun protocollo SSL per comunicare con i server di PayTrace.

+2

Tuttavia, l'abilitazione di TLS 1.0 non è consigliata e vietata per la conformità PCI. – Keith

+1

Questa è una modifica pericolosa: TLS 1.0 è noto per la sicurezza. – Paul

+0

La risposta http://stackoverflow.com/a/42124951/117350 risolve il problema utilizzando una versione più recente di TLS –

3

Abilitare TLS 1.0 ha risolto anche i nostri problemi (dopo aver disabilitato SSL v3). (Server 2012 R2 con elaborazione sito Web ASP.net 4.0 contro servizi di pagamento PPI). Questo è lo script RegEdit che ho usato per impostare tutto come volevo. Abbiamo disattivato SSL v3 solo per il client e non per il server in quanto ciò ha rotto altre cose che non eravamo ancora pronte a gestire. Dopo aver aggiornato il sito a .Net 4.5.2, disabiliteremo nuovamente TLS 1.0.

Questo script abilita tutti i protocolli, server e client ad eccezione di SSL v3 per il client.

-Eric Niemiec

(Assicurarsi di backup del registro !!)

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 
+3

Tuttavia, l'abilitazione di TLS 1.0 non è consigliata e vietata per la conformità PCI. – Keith

+0

Al momento di questo post è stato permesso fino a quando determinati algoritmi sono stati disabilitati sul tuo server per prevenire l'attacco di Beast. Potrebbe non essere più consentito, lo so. I regolamenti bancari impediscono il TLS 1.0 in qualsiasi forma, non sono sicuro della conformità PCI. – matwonk

0

Dopo scherzi con questo per giorni, il mio fix finale per i nostri problemi richiesto due cose;

1) Abbiamo aggiunto questa riga di codice a tutte le nostre librerie .Net che eseguono chiamate api associate ad altri fornitori che hanno disabilitato anche la loro SSL v3.

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

2) Questo è il registro finale e FULL cambia è necessario quando si esegue ASP.Net 4.0 siti e dovrà essere leggermente modificato dopo l'aggiornamento a ASP.Net 4.5.

Dopo aver riavviato i server, tutti i problemi sono andati via dopo questo.

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 
26

Ci sono molti altri post su questo ora, ma tutti puntano a abilitare TLS 1.2. Nulla di meno è pericoloso.

È possibile eseguire questa operazione in .NET 3.5 con una patch.
Si può fare questo in .NET 4.0 e 4.5 con una sola riga di codice

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

In .NET 4.6, utilizza automaticamente TLS 1.2.

Vedi qui per maggiori dettagli: .NET support for TLS

+4

questo ha risolto il problema per me e, a mio parere, dovrebbe essere la risposta accettata –

+1

Dove deve essere inserita questa riga di codice? – NRW

+2

@NRW mettilo ovunque inizi l'applicazione. Questo è un valore globale: mettilo in Global.asax nell'evento Application_Start(). – Paul

Problemi correlati