web-dev-qa-db-fra.com

Le client et le serveur ne peuvent pas communiquer car ils ne possèdent pas d'algorithme commun

J'ai un problème avec une passerelle C # PayTrace. Le code ci-dessous fonctionnait bien jusqu'à hier, quand je pense qu'ils ont désactivé SSL3 en raison de Poodle Exploit. Lors de l'exécution du code ci-dessous, nous avons reçu le message suivant. Le serveur distant a fermé de force la connexion. Après des recherches sur le problème, nous avons déterminé que, parce que notre IIS Server 7.5 était configuré pour utiliser encore SSL3, C # était configuré par défaut sur SSL3, ce que PayTrace fermerait de force la connexion. Nous avons ensuite supprimé SSL3 du serveur. Ce qui conduit alors à l'erreur suivante: 

Le client et le serveur ne peuvent pas communiquer car ils ne possèdent pas d'algorithme commun.  

Mon hypothèse est qu'il y a un algorithme SSL supplémentaire que nous devons installer sur le serveur maintenant que SSL 3 est supprimé. Notre personnel informatique affirme que TLS 1.1 et TLS 1.2 fonctionnent et qu'ASP.NET devrait désormais les remplacer par défaut. Mais j’ai l’impression que nous devons encore installer quelque chose sur le serveur. Je n’ai aucune connaissance des algorithmes SSL, je ne sais donc pas par où commencer. 

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

En outre, ce problème ne se produit qu’à titre d’information lorsque nous nous connectons à la passerelle First Data E4; il ne s’agit donc pas uniquement de PayTrace. Je suppose que, à mesure que davantage de passerelles désactivent l'accès à SSL3, nous allons continuer à rencontrer des problèmes avec d'autres passerelles jusqu'à ce que cela puisse être résolu sur le serveur. De plus, j'ai trouvé quelques suggestions en ligne, certaines personnes suggérant de placer le code suivant juste avant de faire la demande sortante: 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Malheureusement, cela n'a pas fonctionné non plus, même erreur. C'est pourquoi je pense que quelque chose de plus doit être installé sur le serveur IIS7.5. Je ne sais pas quoi. 

28
matwonk

Il y a plusieurs autres articles à ce sujet à présent et ils suggèrent tous d'activer TLS 1.2. Rien de moins est dangereux.

Vous pouvez le faire dans .NET 3.5 avec un correctif.
Vous pouvez le faire dans .NET 4.0 et 4.5 avec une seule ligne de code

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

Dans .NET 4.6, il utilise automatiquement TLS 1.2.

Voir ici pour plus de détails: support .NET pour TLS

53
Paul

C'était résolu. Il s'avère que notre personnel informatique était correct. TLS 1.1 et 1.2 ont été installés sur le serveur. Cependant, le problème était que nos sites fonctionnaient en tant que ASP.NET 4.0 et que vous deviez utiliser ASP.NET 4.5 pour exécuter TLS 1.1 ou 1.2. Pour résoudre le problème, notre personnel informatique a donc dû réactiver TLS 1.0 pour permettre une connexion avec PayTrace. 

En bref, le message d'erreur "Le client et le serveur ne peuvent pas communiquer car ils ne possèdent pas d'algorithme commun" a été provoqué par l'absence de protocole SSL sur le serveur pour communiquer avec les serveurs de PayTrace. 

6
matwonk

L'activation de TLS 1.0 a également résolu nos problèmes (après la désactivation de SSL v3). (Traitement du site Web Server 2012 R2 avec ASP.net 4.0 contre les services payants PPI). C’est le script RegEdit que j’utilisais pour définir tout ce que je voulais. Nous avons uniquement désactivé SSL v3 pour le client et non pour le serveur, car cela cassait d'autres problèmes que nous n'étions pas encore prêts à gérer. Après la mise à niveau du site vers .Net 4.5.2, nous allons à nouveau désactiver TLS 1.0.

Ce script active tous les protocoles, serveur et client, à l'exception de SSL v3 pour le client.

-Eric Niemiec

(Assurez-vous de sauvegarder votre base de registre !!)

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

Dans une réponse précédente, il avait été suggéré d'utiliser cette ligne de code pour .Net 4.5:

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

Je vous encourage à OR cette valeur, quelle que soit la valeur existante, comme ceci:

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

Si vous regardez la liste de valeurs, vous remarquerez qu’elles sont une puissance de deux. Ainsi, dans le futur, par exemple, lorsque vous passerez à TLS 2.0, votre code fonctionnera toujours. 

4
Philly Frank

Dans mon cas, même si la structure cible du projet était 4.7.1, la même erreur se présentait toujours, mais la solution consistait à modifier httpRuntime dans web.config sous system.web en 4.7.1!

2
Jack Ryder

Après avoir gâché cela pendant des jours, ma solution finale à nos problèmes nécessitait deux choses;

1) Nous avons ajouté cette ligne de code à toutes nos bibliothèques .Net qui établissent des appels API liés à d’autres fournisseurs qui ont également désactivé leur SSL v3.

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

2) Il s'agit des modifications de registre définitives et complètes dont vous aurez besoin lorsque vous exécuterez des sites ASP.Net 4.0 et qui devront être légèrement modifiées après la mise à niveau vers ASP.Net 4.5.

Après avoir redémarré les serveurs, tous les problèmes ont disparu.

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

Dans les réponses précédentes, il manque quelques clés de registre qui pourraient ne pas exister . Ce sont des SchUseStrongCrypto qui doivent exister pour permettre aux protocoles TLS de fonctionner correctement.

Une fois les clés de registre importées dans le registre, vous ne devriez plus avoir à modifier le code tel que 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Vous trouverez ci-dessous toutes les clés de registre et toutes les valeurs nécessaires au système d'exploitation Windows x64 . Si vous disposez d'un système d'exploitation 32 bits (x86), supprimez simplement les deux dernières lignes . TLS 1.0 sera désactivé par le script de registre . Le redémarrage du système d'exploitation est requis. 

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