2009-02-18 3 views
89

Я пишу программу, которая читает контент с предоставленного пользователем URL. Моя проблема заключается в коде, который выходит что-то вроде этого:Как использовать WebRequest для доступа к зашифрованному сайту SSL с помощью https?

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

И это нарушение, если предоставленный URL является «https: //» URL. Может ли кто-нибудь помочь мне с изменением этого кода, чтобы он работал с SSL-зашифрованным контентом. Благодарю.

ответ

150

Вы делаете это правильно, но пользователи могут предоставлять URL-адреса сайтам, на которых установлены недействительные сертификаты ssl. Вы можете игнорировать этот CERT проблему, если вы поставите эту строку прежде, чем сделать фактический веб-запрос:

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

где AcceptAllCertifications определяется как

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

Это была моя проблема. Я делал это правильно, за исключением того, что когда я тестировал свой код, я предоставлял https: // localhost, что привело к ошибке, потому что сертификат был для www.mycompany.com. Спасибо, что указал мне в правильном направлении. –

+36

Спасибо за этот ответ! Чтобы избежать бесполезного кода, я использовал его так: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true; –

+2

Спасибо, ты помог мне сэр. F # делает это проще: '' ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true) '' –

15

Эта ссылка будет представлять интерес для Вас: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

Для HTTP-соединений, то WebRequest и классы WebResponse использовать SSL для взаимодействия с веб-узлы, поддерживающие SSL. Решение использовать SSL производится классом WebRequest на основе его URI. Если URI начинается с «https:», используется SSL; если URI начинается с «http:», используется незашифрованное соединение.

+0

Отличная ссылка. Это важное различие. – DanM7

+0

Ваш ответ подразумевает, что код в вопросе должен работать? –

6

это один работал для меня:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
+1

Значение по умолчанию -« Ssl2 | Tls ». Я только включил Tls 1.1 и 1.2 на моем сервере. Это действительно решило проблему! Для LetsEncrypt с nginX на linux протоколы определены здесь: /etc/letsencrypt/options-ssl-nginx.conf – Jerther

+0

Я считаю, что это имеет дело с другой проблемой. Речь идет не о недействительных сертификатах, а о более высоких версиях TLS. – wp78de