2009-02-18 12 views
89

Ich schreibe ein Programm, das Inhalt von einer vom Benutzer bereitgestellten URL liest. Mein Problem ist in dem Code, der etwas geht:Wie benutze ich WebRequest, um mit https auf eine SSL-verschlüsselte Site zuzugreifen?

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

Und das bricht, wenn die zur Verfügung gestellt url ist ein "https: //" URL. Kann mir jemand helfen, diesen Code zu ändern, damit er mit SSL-verschlüsseltem Inhalt funktioniert. Vielen Dank.

Antwort

150

Sie tun es auf die richtige Weise, aber Benutzer können URLs auf Websites bereitstellen, die ungültige SSL-Zertifikate installiert haben. Sie können diese cert Probleme ignorieren, wenn Sie diese Zeile in setzen, bevor Sie die eigentliche Web-Anfrage machen:

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

wo AcceptAllCertifications als

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

Das war genau mein Problem. Ich habe es richtig gemacht, außer dass ich beim Testen meines Codes https: // localhost bereitgestellt habe, was zu einem Fehler führte, weil das Zertifikat für www.mycompany.com war. Danke, dass Sie mich in die richtige Richtung weisen. –

+36

Danke für diese Antwort! Um unnötigen Code zu vermeiden, habe ich ihn wie folgt verwendet: ServicePointManager.ServerCertificateValidationCallback = (s, cert, kette, ssl) => true; –

+2

Danke, du hast mir geholfen, Sir. F # macht das so einfacher: '' ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (Spaß _ _ _ _ -> true) '' –

15

wird dieser Link für Sie von Interesse sein: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

für HTTP-Verbindungen verwenden Sie die Klassen WebRequest und WebResponse SSL mit Internet-Hosts zu kommunizieren, die SSL unterstützen. Die Entscheidung, SSL zu verwenden, wird von der WebRequest-Klasse basierend auf dem URI getroffen, den sie erhält. Wenn der URI mit "https:" beginnt, wird SSL verwendet. Wenn der URI mit "http:" beginnt, wird eine unverschlüsselte Verbindung verwendet.

+0

Großartige Verbindung. Das ist ein wichtiger Unterschied. – DanM7

+0

Ihre Antwort impliziert, dass der Code in der Frage funktionieren sollte? –

6

Dieses ist für mich gearbeitet definiert:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
+1

Der Standardwert ist" Ssl2 | Tls ". Ich hatte nur Tls 1.1 und 1.2 auf meinem Server aktiviert. Dies hat das Problem gelöst! Für LetsEncrypt mit nginX auf Linux sind die Protokolle hier definiert: /etc/letsencrypt/options-ssl-nginx.conf – Jerther

+0

Ich glaube, das ist mit einem anderen Thema beschäftigt. Es geht nicht um ungültige Certs, sondern um höhere TLS-Versionen. – wp78de