Je développe un client TCP pour connecter le serveur OpenSSL avec l'authentification par certificat. J'utilise des fichiers .crt et .key partagés par l'équipe du serveur. Ces certificats sont générés par des commandes OpenSSL.
J'utilise un SslStream
objet pour authentifier le client Tcp en appelant la SslStream.AuthenticateAsClient
méthode en passant le serveur IP
, SslProtocols.Ssl3
et X509CertificateCollection
.
Je reçois l'erreur suivante:
L'authentification a échoué car la partie distante a fermé le flux de transport
SslProtocols.Ssl3
. Tu devrais peut-être essayerSslProtocols.Tls
. Dans .Net 4.5 et supérieur, vous pouvez également utiliserTls11
ouTls12
. Consultez l' énumération SslProtocols . Vous pouvez avoir d'autres problèmes.Réponses:
Je déconseille de restreindre le SecurityProtocol à TLS 1.1.
La solution recommandée est d'utiliser
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
Une autre option consiste à ajouter la clé de registre suivante:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 Value: SchUseStrongCrypto
Il est à noter que .NET 4.6 utilisera le protocole correct par défaut et ne nécessite aucune solution.
la source
System.Net.ServicePointManager.SecurityProtocol = ...
doit être exécuté avant de créer la demande.Si vous souhaitez utiliser une ancienne version de .net, créez votre propre indicateur et lancez-le.
// // Summary: // Specifies the security protocols that are supported by the Schannel security // package. [Flags] private enum MySecurityProtocolType { // // Summary: // Specifies the Secure Socket Layer (SSL) 3.0 security protocol. Ssl3 = 48, // // Summary: // Specifies the Transport Layer Security (TLS) 1.0 security protocol. Tls = 192, // // Summary: // Specifies the Transport Layer Security (TLS) 1.1 security protocol. Tls11 = 768, // // Summary: // Specifies the Transport Layer Security (TLS) 1.2 security protocol. Tls12 = 3072 } public Session() { System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls); }
la source
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
L'ajout du code ci-dessous m'a aidé à résoudre le problème.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
la source
using (var client = new HttpClient(handler)) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false); await response.Content.ReadAsStringAsync().ConfigureAwait(false); }
Cela a fonctionné pour moi
la source
J'ai rencontré le même message d'erreur lors de l'utilisation de ChargifyNET.dll pour communiquer avec l'API Chargify. Ajouter
chargify.ProtocolType = SecurityProtocolType.Tls12;
de la configuration a résolu le problème pour moi.Voici l'extrait de code complet:
public ChargifyConnect GetChargifyConnect() { var chargify = new ChargifyConnect(); chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"]; chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"]; chargify.URL = ConfigurationManager.AppSettings["Chargify.url"]; // Without this an error will be thrown. chargify.ProtocolType = SecurityProtocolType.Tls12; return chargify; }
la source
Pour VB.NET, vous pouvez placer les éléments suivants avant votre requête Web:
Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols) Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType) ServicePointManager.SecurityProtocol = Tls12
Cela a résolu mon problème de sécurité sur .NET 3.5.
la source
Cela m'est arrivé lorsqu'un point de terminaison de requête Web a été basculé vers un autre serveur qui n'acceptait que les requêtes TLS1.2. J'ai essayé tant de tentatives trouvées principalement sur Stackoverflow comme
System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; à Global.ASX OnStart,
L'exception reçue n'a pas rendu justice au problème réel auquel j'étais confronté et n'a trouvé aucune aide de la part de l'opérateur de service.
Pour résoudre ce problème, je dois ajouter une nouvelle suite de chiffrement TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 J'ai utilisé l'outil IIS Crypto 2.0 à partir d' ici, comme indiqué ci-dessous.
la source