Ich entwickle einen TCP-Client, um den OpenSSL-Server mit der Zertifikatauthentifizierung zu verbinden. Ich habe .crt- und .key-Dateien verwendet, die vom Serverteam gemeinsam genutzt werden. Diese Zertifikate werden von OpenSSL-Befehlen generiert.
Ich verwende SslStream
Objekt, um den TCP-Client durch Aufrufen der SslStream.AuthenticateAsClient
Methode durch Übergeben des Servers zu authentifizieren IP
, SslProtocols.Ssl3
und X509CertificateCollection
.
Ich erhalte die folgende Fehlermeldung:
Die Authentifizierung ist fehlgeschlagen, da die Gegenstelle den Transportstrom geschlossen hat
SslProtocols.Ssl3
. Vielleicht solltest du es versuchenSslProtocols.Tls
. In .Net 4.5 und höher können Sie auchTls11
oder verwendenTls12
. Siehe SslProtocols-Aufzählung . Möglicherweise haben Sie andere Probleme.Antworten:
Ich würde davon abraten, das SecurityProtocol auf TLS 1.1 zu beschränken.
Die empfohlene Lösung ist zu verwenden
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
Eine weitere Option ist das Hinzufügen des folgenden Registrierungsschlüssels:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 Value: SchUseStrongCrypto
Es ist erwähnenswert, dass .NET 4.6 standardmäßig das richtige Protokoll verwendet und keine der beiden Lösungen erfordert.
quelle
System.Net.ServicePointManager.SecurityProtocol = ...
dies ausgeführt werden muss, bevor die Anforderung erstellt wird.Wenn Sie eine ältere Version von .net verwenden möchten, erstellen Sie Ihr eigenes Flag und setzen Sie es um.
// // 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); }
quelle
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Durch Hinzufügen des folgenden Codes konnte ich das Problem beheben.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
quelle
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); }
Das hat bei mir funktioniert
quelle
Bei der Verwendung der ChargifyNET.dll für die Kommunikation mit der Chargify-API ist dieselbe Fehlermeldung aufgetreten. Das Hinzufügen
chargify.ProtocolType = SecurityProtocolType.Tls12;
zur Konfiguration löste das Problem für mich.Hier ist das vollständige Code-Snippet:
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; }
quelle
Für VB.NET können Sie Folgendes vor Ihre Webanforderung stellen:
Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols) Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType) ServicePointManager.SecurityProtocol = Tls12
Dies löste mein Sicherheitsproblem unter .NET 3.5.
quelle
Dies geschah mir, als ein Webanforderungsendpunkt auf einen anderen Server umgeschaltet wurde, der nur TLS1.2-Anforderungen akzeptierte. Versuchte so viele Versuche meistens auf Stackoverflow zu finden wie
System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; zu Global.ASX OnStart,
Die erhaltene Ausnahme wurde dem tatsächlichen Problem, mit dem ich konfrontiert war, nicht gerecht und fand keine Hilfe vom Dienstbetreiber.
Um dies zu lösen, muss ich eine neue Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 hinzufügen. Ich habe von hier aus das IIS Crypto 2.0 Tool verwendet , wie unten gezeigt.
quelle