Note that there are some explanatory texts on larger screens.

plurals
  1. POProblem SSL Certificate C#
    text
    copied!<p>In my C# application, I got to call web services via https and validate using a .crt file that I already have. Here is the correct solution for such needs. I have updated this post once I got a working solution, thinking it might help others like me. </p> <p><strong>SOLUTION :</strong> The below code has to be executed only once in the whole application execution. With this we set the ServerCertification and SSL properties that will be used whenever a reqest will be called :</p> <pre><code> public static void setSSLCertificate() { clientCert = new X509Certificate2(AUTHEN_CERT_FILE); // Pointing to the .crt file that will be used for server certificate verification by the client System.Net.ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation); } public static bool customXertificateValidation(Object sender, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPoicyErrors) { switch (sslPoicyErrors) { case System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors: case System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch: case System.Net.Security.SslPolicyErrors.RemoteCertificateNotAvailable: break; } return clientCert.Verify(); // Perform the Verification and sends the result } </code></pre> <p>A request is done normally like we do without implementing SSL. Here is a Post request code :</p> <pre><code> private static String SendPost(String uri, String post_data) { String resData = ""; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version10; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; // turn request string into byte[] byte[] postBytes = Encoding.ASCII.GetBytes(post_data); Stream requestStream = null; try { // Send it request.ContentLength = postBytes.Length; requestStream = request.GetRequestStream(); requestStream.Write(postBytes, 0, postBytes.Length); } catch (WebException we) { // If SSL throws exception that will be handled here if (we.Status == WebExceptionStatus.TrustFailure) throw new Exception("Exception Sending Data POST : Fail to verify server " + we.Message); } catch (Exception e) { throw new Exception("Exception Sending Data POST : " + e.Message, e.InnerException); } finally { if (requestStream != null) requestStream.Close(); } // Get the response HttpWebResponse response = null; try { response = (HttpWebResponse)request.GetResponse(); if (response == null) return ""; StreamReader sr = new StreamReader(response.GetResponseStream()); resData = sr.ReadToEnd().Trim(); sr.Close(); } catch (Exception e) { throw new Exception("Error receiving response from POST : " + e.Message, e.InnerException); } finally { if (response != null) response.Close(); } return resData; } </code></pre> <p>Special Thanks to Dipti Mehta whose explination helped me achieve the goal to a great extend by accepting the server certificate. She helped me solve my confussions. I finally found how to verify the server certificate using .crt file by the client. </p> <p>Hope this helps somebody.</p> <p>Thanks</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload