Die Authentifizierung ist fehlgeschlagen, da die entfernte Partei den Transportstrom geschlossen hat

85

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 SslStreamObjekt, um den TCP-Client durch Aufrufen der SslStream.AuthenticateAsClientMethode durch Übergeben des Servers zu authentifizieren IP, SslProtocols.Ssl3und X509CertificateCollection.

Ich erhalte die folgende Fehlermeldung:

Die Authentifizierung ist fehlgeschlagen, da die Gegenstelle den Transportstrom geschlossen hat

Odelu
quelle
2
Dies scheint ein Problem in den Tagen nach POODLE zu sein : SslProtocols.Ssl3. Vielleicht solltest du es versuchen SslProtocols.Tls. In .Net 4.5 und höher können Sie auch Tls11oder verwenden Tls12. Siehe SslProtocols-Aufzählung . Möglicherweise haben Sie andere Probleme.
JWW
Vielen Dank. Mein Problem wird gelöst, indem das Zertifikat über den physischen Pfad des Zertifikats und des Kennworts angehängt wird, anstatt den Namen des Zertifikatsbetreffs im Windows-Zertifikatspeicher zu suchen.
Odelu
Jetzt kann ich das Ergebnis von allen SslProtocols (SSL3, Tls1 und Tls2) erhalten. Danke für die Antwort
Odelu
@ Odelu, wie hast du das Problem behoben? Auf Client- oder Serverseite?

Antworten:

153

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.

GuiSim
quelle
6
Wow, du hast gerade mein Problem gelöst - ich habe alle möglichen Dinge ausprobiert - und bist dann hier gelandet und hast die Notiz auf dem Framework gesehen. Einfach auf 4.6.1 umgestellt (verwendet 4.5), in der Hoffnung, dass das Framework möglicherweise das falsche Sicherheitsprotokoll verwendet - und Bingo, meine Verbindungen werden nicht abgelehnt und ich erhalte meine Daten!
Veverke
7
Es ist wichtig zu sagen, dass System.Net.ServicePointManager.SecurityProtocol = ...dies ausgeführt werden muss, bevor die Anforderung erstellt wird.
Tonatio
2
Das Update der Ziel-Framework-Version auf 4.6.1 hat mir das Leben gerettet :-)
Awais
Mein Framework ist auf 4.6.2 eingestellt. Vielleicht muss ich stattdessen die TLS-Lösung verwenden
Luminous
Ich verwende 4.7.2 Framework. Auch die Site, an die ich eine Anfrage sende, verwendet TLS 1.2, aber bei 6 Anfragen von 10 erhalte ich diesen Fehler. irgendwelche Ideen ?
Davit Mikuchadze
16

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);
    }
Leguanware
quelle
1
Sie müssen keine eigene Klasse verwenden, sondern können Ganzzahlen direkt in SecurityProtocolTypeServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan F.
13

Durch Hinzufügen des folgenden Codes konnte ich das Problem beheben.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
Muruge
quelle
8
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

Sanket Sonavane
quelle
1
Das kritische Bit ist die folgende Zeile: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; Diese Antwort ist jedoch großartig, da sie zeigt, wo diese Linie in den typischen Anwendungsfall passen sollte.
Nick Painter
5

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;
}
Tod Birdsall
quelle
2

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.

user1477388
quelle
0

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

  1. Registrierungsschlüssel,
  2. Hinzugefügt:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; zu Global.ASX OnStart,
  3. In Web.config hinzugefügt.
  4. Das .Net-Framework wurde auf 4.7.2 aktualisiert. Es wird immer noch dieselbe Ausnahme angezeigt.

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.

Geben Sie hier die Bildbeschreibung ein

FunMatters
quelle