Problème de Certificat SSL C#

Dans mon application en C#, j'ai eu à appeler des services web via https et valider à l'aide de un .crt fichier que j'ai déjà. Ici est la bonne solution pour de tels besoins. J'ai mis à jour ce post une fois que j'ai une solution qui fonctionne, en pensant qu'il pourrait aider d'autres personnes comme moi.

SOLUTION :
Le code ci-dessous doit être exécutée qu'une seule fois dans l'ensemble de l'exécution de l'application. Avec cela nous avons mis l'ServerCertification et SSL propriétés qui seront utilisées à chaque fois qu'une demande sera appelé :

        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
    }

Une demande est effectuée normalement, comme nous le faire sans l'implémentation de SSL. Voici un Post de demande de 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;
}

Un Merci spécial à Dipti Mehta dont explination m'a aidé à atteindre l'objectif en grande partie par accepter le certificat du serveur. Elle m'a aidé à résoudre mon confussions. J'ai enfin trouvé comment faire pour vérifier le certificat du serveur à l'aide .crt fichier par le client.

Espère que cela aide quelqu'un.

Grâce

OriginalL'auteur Tvd | 2011-04-19