Как использовать WebRequest для доступа к сайту с шифрованием SSL с помощью HTTPS?

Я пишу программу, которая считывает контент с предоставленного пользователем URL-адреса. Моя проблема в коде, который выглядит примерно так:

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

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


person Alfred B. Thordarson    schedule 18.02.2009    source источник


Ответы (4)


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

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;
}
person LukeDuff    schedule 18.02.2009
comment
Спасибо за этот ответ! Чтобы избежать бесполезного кода, я использовал его так: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) = ›true; - person Charles Ouellet; 27.10.2011
comment
Спасибо, вы мне помогли, сэр. F # делает это намного проще: ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true) - person David Grenier; 11.01.2012
comment
Я предпочитаю += delegate { return true; } - person vkrzv; 24.08.2012
comment
Помните о потенциальных рисках, связанных с этим подходом. См. stackoverflow.com/a/6613434/2969615 для получения дополнительной информации. - person Joe Coyle; 24.10.2018

Это сработало для меня:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
person Nani    schedule 05.01.2017
comment
Значение по умолчанию - Ssl2 | Tls. У меня на сервере были только Tls 1.1 и 1.2. Это действительно устранило проблему! Для LetsEncrypt с nginX в Linux протоколы определены здесь: /etc/letsencrypt/options-ssl-nginx.conf - person Jerther; 03.10.2017
comment
Я считаю, что это другой вопрос. Речь идет не о недействительных сертификатах, а о более высоких версиях TLS. - person wp78de; 21.12.2017

Вам будет интересна эта ссылка: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

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

person GurdeepS    schedule 18.02.2009
comment
Ваш ответ подразумевает, что код в вопросе должен работать? - person Rowland Shaw; 12.02.2016

Как правильно говорит наиболее проголосовавший ответ @LukeDuff, вероятно, сервер использует недействительный или ненадежный (или самоподписанный, что технически также ненадежный) сертификат. Но в ответ слепо принимает любой сертификат. И что еще хуже, любой сертификат для любого сайта, даже для сайтов, где вы ожидаете надежный и действующий сертификат. Это недостаток безопасности.

При реализации ServicePointManager.ServerCertificateValidation callback следует подтвердите сертификат. Например. проверив хэш сертификата по известному значению:

using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, certificate, chain, errors) =>
    {
        return
            (errors == SslPolicyErrors.None) ||
            certificate.GetCertHashString(HashAlgorithmName.SHA256).Equals(
                "EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA67737179E3C85BC3CD09D4EEC");
    };

Для -less перегрузка, возвращающая хэш SHA-1.


На основании Безопасно ли тестировать свойство X509Certificate.Thumbprint, если вы знаете, что недействительный сертификат безопасен?

Для версии кода VB.NET см. Принять самозаверяющий сертификат TLS / SSL в VB.NET.

person Martin Prikryl    schedule 31.03.2021