2009-02-18 9 views
89

Piszę program, który czyta treść z podanego przez użytkownika adresu URL. Mój problem jest w kodzie, który wygląda mniej więcej tak:Jak używać WebRequest do uzyskania dostępu do strony zaszyfrowanej za pomocą protokołu HTTPS?

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

I to łamie jeżeli warunkiem url jest „https: //” URL. Czy ktoś może mi pomóc w zmianie tego kodu, aby działał z zaszyfrowaną treścią SSL. Dzięki.

Odpowiedz

150

robisz to we właściwy sposób, ale użytkownicy mogą być dostarczanie adresów URL do stron, które mają nieprawidłowych certyfikatów ssl zainstalowane. Można zignorować te cert problemy, jeśli umieścić tę linię przed dokonaniem faktycznej żądania internetowej:

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

gdzie AcceptAllCertifications jest zdefiniowany jako

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

To był dokładnie mój problem. Robiłem to poprawnie, z tą różnicą, że kiedy testowałem swój kod, dostarczałem https: // localhost, który spowodował błąd, ponieważ certyfikat był dla www.mycompany.com. Dziękuję za wskazanie mnie we właściwym kierunku. –

+36

Dzięki za tę odpowiedź! Aby uniknąć niepotrzebnego kodu, użyłem go w następujący sposób: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true; –

+2

Dzięki, pomogłeś mi, proszę pana. F # czyni to łatwiejszym: '' ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true) '' –

15

Ten link będzie interesujące dla Ciebie: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

przypadku połączeń HTTP, WebRequest i Klasy WebResponse używać SSL do komunikacji z hostów internetowych, które obsługują protokół SSL. Decyzja o użyciu SSL jest podejmowana przez klasę WebRequest, w oparciu o podany identyfikator URI. Jeśli identyfikator URI zaczyna się od "https:", używany jest protokół SSL; jeśli identyfikator URI zaczyna się od "http:", używane jest nieszyfrowane połączenie.

+0

Świetny link. To ważne wyróżnienie. – DanM7

+0

Twoja odpowiedź sugeruje, że kod w pytaniu powinien zadziałać? –

6

ten jeden pracował dla mnie:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
+1

Domyślną wartością jest" Ssl2 | Tls ". Włączyłem tylko Tls 1.1 i 1.2 na moim serwerze. Naprawdę naprawił problem! Dla LetsEncrypt z nginX na linux, protokoły są zdefiniowane tutaj: /etc/letsencrypt/options-ssl-nginx.conf – Jerther

+0

Uważam, że dotyczy to innego problemu. Nie chodzi o nieprawidłowe certyfikaty, ale o wyższe wersje TLS. – wp78de

Powiązane problemy