Imansible creare il canale protetto SSL / TLS, nonostante l’impostazione di ServerCertificateValidationCallback

Sto provando a stabilire una connessione SSL / TLS con un server di prova con certificato autofirmato . La comunicazione attraverso canali non sicuri ha funzionato senza problemi.

Ecco il mio codice di esempio, che ho scritto in base a queste soluzioni: Consentire certificati SSL non attendibili con HttpClient C # Ignorare gli errori del certificato? Client .NET che si collega all’API Web ssl

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; var c = new HttpClient(); var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result; if (r.IsSuccessStatusCode) { Log.AddMessage(r.Content.Get()); } else { Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase)); } 

anche provato questo:

 var handler = new WebRequestHandler(); handler.ServerCertificateValidationCallback = delegate { return true; }; var c = new HttpClient(handler); ... 

e questo

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

ma ogni volta ho un’eccezione:

 InnerException: System.Net.Http.HttpRequestException _HResult=-2146233088 _message=An error occurred while sending the request. HResult=-2146233088 IsTransient=false Message=An error occurred while sending the request. InnerException: System.Net.WebException _HResult=-2146233079 _message=The request was aborted: Could not create SSL/TLS secure channel. HResult=-2146233079 IsTransient=false Message=The request was aborted: Could not create SSL/TLS secure channel. Source=System StackTrace: at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) InnerException: 

Cosa faccio di sbagliato? Perché non riesco a collegarmi a questo server (che ha un certificato autofirmato non valido)

Lo stai facendo correttamente con ServerCertificateValidationCallback. Questo non è il problema che stai affrontando. Il problema che stai affrontando è molto probabilmente la versione del protocollo SSL / TLS.

Ad esempio, se il tuo server offre solo SSLv3 e TLSv10 e il tuo client ha bisogno di TLSv12, riceverai questo messaggio di errore. Quello che devi fare è assicurarti che sia client sia server abbiano una versione di protocollo comune supportata.

Quando ho bisogno di un client che sia in grado di connettersi al maggior numero di server ansible (piuttosto che essere il più sicuro ansible), lo uso (insieme all’impostazione del callback di convalida):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

Come follow-up per chiunque sia ancora coinvolto in questo, ho aggiunto le opzioni ServicePointManager.SecurityProfile come indicato nella soluzione:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

Eppure ho continuato a ottenere lo stesso errore “La richiesta è stata interrotta: imansible creare SSL / TLS secure channel”. Stavo tentando di connettermi ad alcuni vecchi server vocali con interfacce API SOAP HTTPS (ad esempio, posta vocale, sistemi telefonici IP ecc … installati anni fa). Questi supportano solo le connessioni SSL3 come sono state aggiornate l’ultima volta anni fa.

Si potrebbe pensare che includere SSl3 nell’elenco di SecurityProtocols potrebbe fare il trucco qui, ma non è così. L’unico modo per forzare la connessione era includere SOLO il protocollo Ssl3 e nessun altro:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

Poi la connessione passa – mi sembra un errore ma non ho iniziato a lanciare errori fino a poco tempo fa sugli strumenti che fornisco per questi server che sono stati là fuori per anni – credo che Microsoft abbia iniziato a implementare le modifiche di sistema che hanno aggiornato questo comportamento per forzare le connessioni TLS a meno che non ci sia altra alternativa.

Ad ogni modo, se ancora ci si imbatte in alcuni vecchi siti / server, vale la pena provarlo.

Abbiamo risolto lo stesso problema solo oggi e tutto quello che devi fare è aumentare la versione di runtime di .NET

4.5.2 non ha funzionato per noi con il problema sopra, mentre 4.6.1 era OK

Se è necessario mantenere la versione .NET, quindi impostare

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

Se stai usando un nuovo nome di dominio, e hai fatto tutto quanto sopra e ricevi ancora lo stesso errore, verifica se cancelli la cache DNS sul tuo PC. Cancella il tuo DNS per maggiori dettagli.

Windows® 8

Per svuotare la cache DNS se si utilizza Windows 8, effettuare le seguenti operazioni:

Sulla tastiera, premi Win + X per aprire il menu WinX.

Fare clic con il tasto destro del mouse su Prompt dei comandi e selezionare Esegui come amministratore.

Esegui il seguente comando:

ipconfig / flushdns

Se il comando ha esito positivo, il sistema restituisce il seguente messaggio:

La configurazione IP di Windows ha svuotato con successo la cache del resolver DNS.

Windows® 7

Per svuotare la cache DNS se si utilizza Windows 7, attenersi alla seguente procedura:

Fai clic su Start.

Inserisci cmd nella casella di testo di ricerca del menu Start.

Fare clic con il tasto destro del mouse su Prompt dei comandi e selezionare Esegui come amministratore.

Esegui il seguente comando:

ipconfig / flushdns

Se il comando ha esito positivo, il sistema restituisce il seguente messaggio: Configurazione IP di Windows con svuotamento riuscito della cache del resolver DNS.

Mi sono imbattuto in questo thread perché avevo anche l’errore Imansible creare il canale sicuro SSL / TLS. Nel mio caso, stavo tentando di accedere a un’API REST di configurazione Siebel da PowerShell utilizzando Invoke-RestMethod e nessuno dei suggerimenti sopra riportati ha aiutato.

Alla fine mi sono imbattuto nella causa del mio problema: il server con cui stavo contattando l’autenticazione del certificato client richiesta.

Per far funzionare le chiamate, ho dovuto fornire il certificato client (inclusa la chiave privata) con il parametro -Certificate :

 $Pwd = 'certificatepassword' $Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2' $Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet') Invoke-RestMethod -Uri 'https://your.rest.host/api/' -Certificate $Pfx -OtherParam ... 

Spero che la mia esperienza possa aiutare qualcun altro che abbia il mio particolare sapore di questo problema.

sposta questa riga: ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Prima di questa riga: richiesta HttpWebRequest = (HttpWebRequest) WebRequest.Create (uri);

Post originale: l’ aggiornamento della sicurezza KB4344167 interrompe il codice TLS