Как использовать HTTP GET запрос в C # с SSL? (нарушение протокола) - PullRequest
9 голосов
/ 02 апреля 2009

В настоящее время я пытаюсь получить ответ от сервера, который использует SSL в C #. У меня есть код для этого в Java, но похоже, что они не переводят 1: 1.

У меня есть какой-то код, который я нашел, который работает для обычных страниц, но не для того, который мне нужен (возможно, из-за SSL). Вот код:

        WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort);
    request.Proxy = null;
    request.Credentials = CredentialCache.DefaultCredentials;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();

ОБНОВЛЕНИЕ: Извините, я забыл, что это за ошибка. Я получаю исключение нарушения протокола в строке "HttpWebResponse response = (HttpWebResponse) request.GetResponse ();". Есть идеи? Спасибо, ребята.

Ответы [ 3 ]

14 голосов
/ 02 апреля 2009

HTTP-разговоры по SSL используют правильно выданный сертификат для проверки.

Вы можете использовать делегат RemoteCertificateValidationCallback для проверки SSL-сертификата следующим образом:

public static void ConnectSSL()
{

    WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort);
    request.Proxy = null;
    request.Credentials = CredentialCache.DefaultCredentials;

   //allows for validation of SSL certificates 

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

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();

}

//for testing purpose only, accept any dodgy certificate... 
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
          return true; 
}
2 голосов
/ 02 апреля 2009

Просто идея, но пробовали ли вы ее с окончательным "/"? Кроме того, вам может показаться, что такой подход проще:

string s;
using(WebClient client = new WebClient()) {
    client.UseDefaultCredentials = true;
    s = client.DownloadString("https://" + sslServerHost + ":"
       + sslServerPort + "/");
}
1 голос
/ 22 апреля 2009

Вот тестовый код, который я успешно использовал для тестирования соединений SSL ...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.dscoduc.com");
//request.Method = "HEAD";
//request.AllowAutoRedirect = false;
request.Credentials = CredentialCache.DefaultCredentials;

// Ignore Certificate validation failures (aka untrusted certificate + certificate chains)
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
StreamReader reader = new StreamReader(resStream);
string responseFromServer = reader.ReadToEnd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...