Создайте SSL WebRequest с C #

Я делаю код, который читает страницу и программно загружает ее содержимое, но он не работает так же, как браузер. Обратите внимание, что я также использую строку cookie.

мой код:

string strUrl = "http:" + "//mgac.webex." + "com";
string cookies_str = "vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R2355168776; JSESSIONID=Qlq1TR7Hf09KTsGHr4vv2GnTFF0NGRlLmGyYmMvzY5M29pbZ8yNp!31020270; DetectionBrowserStatus=3|1|32|1|4|2; CK_LanguageID_503319=1; CK_TimeZone_503319=4; CK_RegionID_503319=2; vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R2355168776; JSESSIONID=Qlq1TR7Hf09KTsGHr4vv2GnTFF0NGRlLmGyYmMvzY5M29pbZ8yNp!31020270;";
string other_saved_cookies = "screenWidth=1280; CK_CDNHostStatus=akamaicdn.webex.com|1322367753273|1";

string s;
using (WebClient client = new WebClient())
{
    client.UseDefaultCredentials = true;
    client.Headers.Add(HttpRequestHeader.Cookie, cookies_str);
    s = client.DownloadString(strUrl);
}

Я получаю такой ответ: «Страница не может быть найдена ...»

когда я просматриваю запрос с помощью Fiddler, мой браузер получает тот же ответ, после чего он делает новый запрос на использование SSL для того же хоста.

Как я могу сделать точно такой же запрос для получения контента, как браузер

Где информация, которая сообщает клиенту: «требуется SSL-соединение»?


person Alexei    schedule 27.11.2011    source источник


Ответы (4)


Похоже, что вам нужно Как использовать HTTP-запрос GET в C # с SSL? (нарушение протокола)

Но изменение «http» на «https» может быть хорошей отправной точкой!
Затем, очевидно, установите ServicePointManager.ServerCertificateValidationCallback, как показано в 2 из ответов на вышеуказанный пост.

РЕДАКТИРОВАТЬ

Добавлять

string ua = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0";

тогда

client.Headers.Add(HttpRequestHeader.UserAgent, ua);

Затем проанализируйте заголовок Location перенаправленного результата.

person shunty    schedule 27.11.2011
comment
как клиент должен знать, что требуется безопасное соединение? Я не могу получить это в ответе - person Alexei; 28.11.2011
comment
Строго говоря, я не думаю, что из ответа можно сделать вывод о необходимости SSL. См. Эту тему SO: stackoverflow.com/questions/2554778/ - person shunty; 28.11.2011
comment
Я не хочу делать вывод, я просто хочу создать код, который устанавливает https-соединение, если это необходимо, понимая это из первого ответа, сделанного на http, точно так же, как показано в коде, вы можете попробовать с тем же URL-адресом, который указано в примере кода. - person Alexei; 30.11.2011
comment
Получите более подробную информацию о Fiddler, когда вы сделаете запрос из браузера. Ответ будет другим, если вы добавите строку User-Agent. Без этого заголовка вы получите перенаправление (302) с последующим успехом (200). С этим заголовком вы получаете перенаправление, а затем другое перенаправление с заголовком Location, указывающим на сайт https. Так что попробуйте, например: string ua = User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 8.0) Gecko / 20100101 Firefox / 8.0; client.Headers.Add (HttpRequestHeader.UserAgent, ua); Затем проанализируйте заголовки. - person shunty; 30.11.2011

Этот веб-сайт использует 302 редиректа, чтобы перенаправить вас на страницу SSL.

Класс WebClient .NET - это интеллектуальный класс, который автоматически следует перенаправлениям. Он использует класс HttpWebRequest и устанавливает AllowAutoRedirect к истине.

Поэтому, если вы отправляете свой запрос на исходный URL-адрес, WebClient переходит через перенаправления (используя новые запросы), пока результат будет 302 (своего рода перенаправление). Если код результата другой, вы получите результат. Это похоже на один HTTP-запрос, но он выполняет 2 HTTP-запроса и 1 HTTPS-вызов.

Вы должны установить пользовательский агент в этом случае как shunty, опубликованный ранее, потому что удаленному сайту не нравится пользовательский агент .NET по умолчанию: none.

person Marton Rusko    schedule 01.12.2011

Проверьте эту ссылку msdn Безопасность HTTP и веб-службы ASP.NET

По умолчанию флажок Требовать безопасный канал (SSL) снят; выберите его, чтобы требовать SSL. SSL поддерживает как 40-битное, так и 128-битное шифрование. Чем больше битов используется шифрованием, тем сложнее его взломать и выяснить, какими были исходные биты.

Если у вас настроен ресурс, требующий SSL для связи, любые сообщения, отправляемые между отправителем и получателем, будут зашифрованы и подписаны. Это означает, что посторонние лица не могут прочитать содержимое сообщений. Если внешняя сторона изменяет байты в сообщении, получатель сообщения может это обнаружить.

Вам должна понадобиться некоторая информация об учетных данных или сертификатах для идеального запуска вашего кода.

Вы можете использовать делегат RemoteCertificateValidationCallback для проверки сертификата SSL.

Проверьте эти ссылки для справки по коду:

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

Как использовать HTTP-запрос GET в C # с SSL? (нарушение протокола)

https://stackoverflow.com/questions/560804/how-do-i-use-webrequest-to-access-an-ssl-encrypted-site-using-https

person Niranjan Singh    schedule 27.11.2011
comment
Вначале браузер устанавливает http (небезопасное) соединение и получает страницу, которая не найдена, но где информация, которая сообщает браузеру, что он должен установить безопасное соединение? - person Alexei; 28.11.2011

Если вы просто хотите загрузить страницу через https (ssl), это сработает. Если вы хотите взглянуть на сертификат, я рекомендую использовать полный метод delgate.

ServicePointManager.ServerCertificateValidationCallback = ( ( sender , certificate , chain , sslPolicyErrors ) => true );         //allows for validation of SSL certificates 

Или с методом полного делегата

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback( delegateHttpSsl );

        private bool delegateHttpSsl(object obj, System.Security.Cryptography.X509Certificate c1, System.Security.Cryptography.X509Certifciates.X509Chain c2, SslPolicyErrors c3)
        {
              return true;
        }
person Pierluc SS    schedule 01.12.2011