9

I am currently trying to get a response from a server that is using SSL in C#. I have the code to do this in Java, but it looks like they do not translate 1:1.

I do have some code that I found that works for regular pages, but not for the one I need (maybe because of the SSL thing). Here is the code:

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

UPDATE: Sorry I seem to have forgotten what the error is. I'm getting a protocol violation exception at the "HttpWebResponse response = (HttpWebResponse)request.GetResponse(); " line. Any ideas? Thanks guys.

2
  • Amber: Can you describe what's going wrong? Is it just not returning results? Are you getting some sort of exception? If so, what kind of exception, and what is the message? Commented Apr 2, 2009 at 14:54
  • 1
    Could potentially be an untrusted certificate issue? Commented Apr 22, 2009 at 17:55

3 Answers 3

14

HTTP conversations over SSL use a properly issued certificate for validation.

You could use the RemoteCertificateValidationCallback delegate for validating the SSL certificate as follows:

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; 
}
Sign up to request clarification or add additional context in comments.

1 Comment

make sure to dispose of HttpWebResponse properly, or at least call Close() in a finally block!
2

Just an idea, but have you tried it with a final "/"? Also - you might find this approach easier:

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

1 Comment

Thanks for the suggestion, but no dice.
1

Here is some test code that I have used successfully for testing SSL connections...

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.