it-swarm.com.de

Die Authentifizierung ist fehlgeschlagen, weil die Remote-Partei den Transportstream geschlossen hat

Ich entwickle einen TCP - Client, um den OpenSSL-Server mit der Zertifikatauthentifizierung zu verbinden. Ich verwende .crt- und .key-Dateien, die vom Server-Team freigegeben wurden. Diese Zertifikate werden von OpenSSL-Befehlen generiert.

Ich verwende SslStream object, um den Tcp-Client zu authentifizieren, indem ich die SslStream.AuthenticateAsClient - Methode durch Übergeben des Servers IP, SslProtocols.Ssl3 und X509CertificateCollection aufrufe.

Ich erhalte folgende Fehlermeldung:

Die Authentifizierung ist fehlgeschlagen, weil die entfernte Partei den Transportstream geschlossen hat

53
Odelu

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, den folgenden Registrierungsschlüssel hinzuzufügen:

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.

101
GuiSim

Wenn Sie eine ältere Version von .net verwenden möchten, erstellen Sie Ihre eigene Flagge und setzen Sie sie 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);
    }
15
Iguanaware

Das Hinzufügen des folgenden Codes half mir, das Problem zu lösen.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
12
muruge

Ich habe dieselbe Fehlermeldung erhalten, als ich die ChargifyNET.dll für die Kommunikation mit der Chargify-API verwendete. Das Hinzufügen von 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;
}
5
Tod Birdsall

Für VB.NET können Sie vor Ihrer Webanfrage Folgendes eingeben:

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

Damit wurde mein Sicherheitsproblem in .NET 3.5 behoben.

1
user1477388
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

0
Sanket Sonavane