Ignora gli errori di certificati SSL non validi quando si chiamano servizi Web in .Net


88

Stiamo configurando un nuovo SharePoint per il quale non abbiamo ancora un certificato SSL valido. Vorrei chiamare il servizio web Lists su di esso per recuperare alcuni metadati sulla configurazione. Tuttavia, quando provo a farlo, ottengo l'eccezione:

La connessione sottostante è stata chiusa: non è stato possibile stabilire una relazione di trust per il canale protetto SSL / TLS.

L'eccezione nidificata contiene il messaggio di errore:

Il certificato remoto non è valido in base alla procedura di convalida.

Ciò è corretto poiché stiamo utilizzando un certificato temporaneo.

La mia domanda è: come posso dire al client del servizio web .Net ( SoapHttpClientProtocol ) di ignorare questi errori?

Risposte:


18

L'approccio che ho utilizzato per affrontare questo problema è stato quello di aggiungere il firmatario del certificato temporaneo all'elenco delle autorità attendibili sul computer in questione.

Normalmente eseguo test con certificati creati con CACERT e aggiungerli all'elenco delle autorità attendibili ha funzionato a meraviglia.

In questo modo non devi aggiungere alcun codice personalizzato alla tua applicazione e simula correttamente cosa accadrà quando la tua applicazione verrà distribuita. In quanto tale, penso che questa sia una soluzione migliore per disattivare il controllo a livello di programmazione.


Questa è stata anche la mia prima idea. Purtroppo anche il certificato è scaduto, quindi è impossibile ottenerlo attendibile.
Jan.vdbergh

C'è qualche motivo per cui non puoi usare qualcuno come CA Cert? Se si tratta di un certificato di prova, potresti procedere con quello. Non sono sicuro che esista un modo per disattivare questi controlli!
Simon Johnson,

113

In alternativa è possibile registrare un delegato di richiamata che ignora l'errore di certificazione:

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}

1
Ho aggiunto questo metodo statico a global.asax e ho impostato l'evento su "OnApplicationStart". ha funzionato a meraviglia. Grazie
Juan Zamora

1
@JuanZamora Ho fatto la stessa cosa che hai fatto tu. Ha funzionato!
Sachin BR

5
Questo è tutto ciò che devi fare, se vuoi essere vulnerabile all'attacco "Man in the Middle" ...
Houtman

2
Idealmente dovresti farlo solo in un ambiente di sviluppo.
Ron DeFreitas

79

Come la risposta di Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Lo metto nel mio Main e guardo al mio app.confige test se (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")prima di chiamare quella riga di codice.


24

L'ho risolto in questo modo:

Chiama quanto segue appena prima di chiamare il tuo servizio web SSL che causa l'errore:

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}

12

Ho riscontrato lo stesso errore utilizzando DownloadString; ed è stato in grado di farlo funzionare come di seguito con i suggerimenti su questa pagina

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

aggirerà invaild ssl. Scrivilo al costruttore del tuo servizio web.


1

Per i neofiti, puoi estendere la tua classe di servizio parziale in un file cs separato e aggiungere il codice al codice fornito da "imanabidi" per integrarlo


1

Per espandere ulteriormente il post di Simon Johnsons, idealmente vuoi una soluzione che simuli le condizioni che vedrai in produzione e la modifica del tuo codice non lo farà e potrebbe essere pericoloso se dimentichi di estrarre il codice prima di distribuirlo.

Avrai bisogno di un certificato autofirmato di qualche tipo. Se stai usando IIS Express, ne avrai già uno, dovrai solo trovarlo. Apri Firefox o il browser che preferisci e vai al tuo sito web di sviluppo. Dovresti essere in grado di visualizzare le informazioni sul certificato dalla barra degli indirizzi e, a seconda del browser, dovresti essere in grado di esportare il certificato in un file.

Quindi, apri MMC.exe e aggiungi lo snap-in Certificato. Importa il file del certificato nell'archivio Autorità di certificazione radice attendibili e questo è tutto ciò di cui hai bisogno. È importante assicurarsi che vada in quel negozio e non in un altro negozio come "Personale". Se non hai familiarità con MMC o certificati, ci sono numerosi siti Web con informazioni su come farlo.

Ora, il tuo computer nel suo complesso si fiderà implicitamente di tutti i certificati che ha generato da solo e non avrai bisogno di aggiungere codice per gestirlo in modo speciale. Quando si passa alla produzione, continuerà a funzionare a condizione che sia installato un certificato valido appropriato. Non farlo su un server di produzione: sarebbe un male e non funzionerà per altri client oltre a quelli sul server stesso.

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.