2009-02-18 21 views
89

Sto scrivendo un programma che legge il contenuto da un URL fornito dall'utente. Il mio problema è nel codice che va qualcosa come questo:Come utilizzare WebRequest per accedere a un sito crittografato SSL utilizzando https?

Uri uri = new Uri(url); 
WebRequest webRequest = WebRequest.Create(uri); 
WebResponse webResponse = webRequest.GetResponse(); 
ReadFrom(webResponse.GetResponseStream()); 

E questo è rompere se la condizione url è un "https: //" URL. Qualcuno può aiutarmi con la modifica di questo codice in modo che funzioni con contenuto crittografato SSL. Grazie.

risposta

150

Lo stai facendo nel modo corretto ma gli utenti potrebbero fornire url ai siti che hanno installato ssl certs non validi. È possibile ignorare questi problemi cert se metti questa linea prima di effettuare la richiesta web attuale:

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); 

dove AcceptAllCertifications è definito come

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 
+1

Questo era esattamente il mio problema. Lo stavo facendo correttamente tranne che durante il test del mio codice stavo fornendo https: // localhost che ha provocato un errore perché il certificato era per www.mycompany.com. Grazie per avermi indicato nella giusta direzione. –

+36

Grazie per questa risposta! Per evitare un codice inutile, l'ho usato in questo modo: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true; –

+2

Grazie, mi hai aiutato signore. F # rende tutto più semplice: '' ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true) '' –

15

Questo collegamento sarà di vostro interesse: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

per le connessioni HTTP, la classi WebRequest e WebResponse utilizzano SSL per comunicare con gli host web che supportano SSL. La decisione di utilizzare SSL viene stabilita dalla classe WebRequest, in base all'URI fornito. Se l'URI inizia con "https:", viene utilizzato SSL; se l'URI inizia con "http:", viene utilizzata una connessione non crittografata.

+0

Ottimo collegamento. Questa è una distinzione importante. – DanM7

+0

La tua risposta implica che il codice nella domanda dovrebbe funzionare? –

6

Questo ha funzionato per me:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
+1

Il valore predefinito è" Ssl2 | Tls ". Avevo solo abilitato Tls 1.1 e 1.2 sul mio server. Questo ha davvero risolto il problema! Per LetsEncrypt con nginX su linux, i protocolli sono definiti qui: /etc/letsencrypt/options-ssl-nginx.conf – Jerther

+0

Credo che si tratti di un altro problema. Non si tratta di Certs non validi, ma di versioni TLS più elevate. – wp78de

Problemi correlati