title: Problem SSL Certificate C#
body: <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>