2009-04-02 10 views
9

Obecnie próbuję uzyskać odpowiedź od serwera, który używa protokołu SSL w języku C#. Mam kod, aby to zrobić w Javie, ale wygląda na to, że nie tłumaczą 1: 1.Jak korzystać z żądania HTTP GET w języku C# z SSL? (naruszenie protokołu)

Mam kod, który znalazłem działający dla zwykłych stron, ale nie dla tego, którego potrzebuję (być może ze względu na protokół SSL). Oto kod:

 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(); 

AKTUALIZACJA: Przepraszamy, wydaje mi się, że zapomniałem o błędzie. Dostaję wyjątek naruszenia protokołu w linii "HttpWebResponse response = (HttpWebResponse) request.GetResponse();". Jakieś pomysły? Dzięki chłopaki.

+0

Amber: Czy możesz opisać, co się stało? Czy to po prostu nie powracające wyniki? Czy masz jakiś wyjątek? Jeśli tak, jaki rodzaj wyjątku i jaka jest wiadomość? – JMarsch

+1

Czy potencjalnie może to być problem z niezaufanym certyfikatem? – Dscoduc

Odpowiedz

2

Po prostu pomysł, ale czy próbowałeś go z ostatecznym "/"? Ponadto - możesz łatwiej znaleźć to rozwiązanie:

string s; 
using(WebClient client = new WebClient()) { 
    client.UseDefaultCredentials = true; 
    s = client.DownloadString("https://" + sslServerHost + ":" 
     + sslServerPort + "/"); 
} 
+0

Dzięki za sugestię, ale bez kości. –

14

Rozmowy HTTP przez SSL używają prawidłowo wystawionego certyfikatu do sprawdzania poprawności.

Można użyć delegata RemoteCertificateValidationCallback do sprawdzania poprawności certyfikatu SSL, co następuje:

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; 
} 
+0

upewnij się, że prawidłowo pozbywasz się HttpWebResponse, lub przynajmniej wywołaj Close() w bloku finally! –

1

Oto kod testu, który mam z powodzeniem stosowane do testowania połączeń 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(); 
Powiązane problemy