Autenticazione non riuscita perché la parte remota ha chiuso il flusso di trasporto


87

Sto sviluppando un client TCP per connettere il server OpenSSL con l'autenticazione del certificato. Utilizzo file .crt e .key condivisi dal team del server. Questi certificati vengono generati dai comandi OpenSSL.

Sto usando SslStreamoggetto di autenticare il client TCP chiamando il SslStream.AuthenticateAsClientmetodo passando del server IP, SslProtocols.Ssl3e X509CertificateCollection.

Ricevo il seguente errore:

L'autenticazione non è riuscita perché la parte remota ha chiuso il flusso di trasporto


2
Questo appare come un problema nei giorni dopo l'BARBONCINO: SslProtocols.Ssl3. Forse dovresti provare SslProtocols.Tls. In .Net 4.5 e versioni successive, puoi anche usare Tls11o Tls12. Vedere Enumerazione SslProtocols . Potresti avere altri problemi.
jww


Grazie. Il mio problema viene risolto allegando il certificato dal percorso fisico del certificato e della password invece di cercare il nome del soggetto del certificato dall'archivio certificati di Windows.
Odelu

Ora sono in grado di ottenere il risultato da tutti gli SslProtocols (SSL3, Tls1 e Tls2). Grazie per la risposta
Odelu

@ Odelu, come hai risolto il problema? Sul lato client o lato server?

Risposte:


155

Vorrei sconsigliare di limitare il SecurityProtocol a TLS 1.1.

La soluzione consigliata è usare

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls

Un'altra opzione è aggiungere la seguente chiave di registro:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto 

Vale la pena notare che .NET 4.6 userà il protocollo corretto per impostazione predefinita e non richiede nessuna delle due soluzioni.


6
wow, hai appena risolto il mio problema - stavo provando ogni sorta di cose - e poi sei finito qui a vedere la nota sul framework. L'ho appena passato a 4.6.1 (stava usando 4.5), sperando che il problema sarebbe che il framework potrebbe utilizzare il protocollo di sicurezza sbagliato - e bingo, le mie connessioni non vengono rifiutate e ricevo i miei dati!
Veverke

7
È importante dire che System.Net.ServicePointManager.SecurityProtocol = ...deve essere eseguito prima di creare la richiesta.
Tonatio

2
quell'aggiornamento della versione del framework di destinazione alla 4.6.1 mi ha salvato la vita :-)
Awais

Il mio framework è impostato su 4.6.2. Forse dovrò invece usare la soluzione TLS
Luminous

Sto usando 4.7.2 Framework anche il sito a cui sto inviando la richiesta utilizza TLS 1.2 ma è come se a 6 richieste da 10 ricevo questo errore. qualche idea ?
Davit Mikuchadze

16

Se desideri utilizzare una versione precedente di .net, crea il tuo flag e lancialo.

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

1
Non è necessario utilizzare la propria classe, è possibile eseguire il cast di interi direttamente a SecurityProtocolTypeServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan F.

13

L'aggiunta del codice seguente mi ha aiutato a superare il problema.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

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

Questo ha funzionato per me


1
Il bit critico è la seguente riga: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; Questa risposta è ottima, però, perché mostra dove quella linea dovrebbe rientrare nel tipico caso d'uso.
Nick Painter

5

Mi sono imbattuto nello stesso messaggio di errore durante l'utilizzo di ChargifyNET.dll per comunicare con l'API di Chargify. L'aggiunta chargify.ProtocolType = SecurityProtocolType.Tls12;alla configurazione ha risolto il problema per me.

Ecco lo snippet di codice completo:

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

2

Per VB.NET, è possibile inserire quanto segue prima della richiesta web:

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

Questo ha risolto il mio problema di sicurezza su .NET 3.5.


0

Questo mi è successo quando un endpoint di richiesta Web è stato trasferito a un altro server che accettava solo richieste TLS1.2. Ho provato così tanti tentativi trovati principalmente su Stackoverflow come

  1. Chiavi di registro,
  2. Aggiunto:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; a Global.ASX OnStart,
  3. Aggiunto in Web.config.
  4. Aggiornato .Net framework a 4.7.2 Continui a ricevere la stessa eccezione.

L'eccezione ricevuta non ha reso giustizia al problema reale che stavo affrontando e non ho trovato aiuto dall'operatore del servizio.

Per risolvere questo problema devo aggiungere una nuova Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 Ho usato lo strumento IIS Crypto 2.0 da qui come mostrato di seguito.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.