[WebService] Utilisation d'un certificat dans un WebService

Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013
- - Dernière réponse :  eric - 12 juil. 2015 à 11:42
Bonjour tout le monde,


je dois appeler depuis mon Service Web un autre Service Web avec un certificat. J'ai procédé comme suit:


...
        string certPath = @"C:\cb\certificat\Test.cer";
...


classProxy proxy = new classProxy();


.....


proxy.Url = @"https://....";
proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certPath));
....
prox.chercher(....);
....



Lorsque je fais proxy.chercher une exception est déclanchée et le message d'erreur suivant apparaît:


La connexion sous-jacente a été fermée : Impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS.


Dans InnerException, j'ai le message suivant:
Le certificat distant n'est pas valide selon la procédure de validation.



Est-ce quelqu'un connaît la "procédure de validiation ou sait où je peux trouver des infos à ce sujet.


Par avance, merci pour votre aide!


Cédric
Afficher la suite 

7 réponses

Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
Salut, essaye d'ajouter ca dans ton code et dis moi si ca marche :

ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors)
{
    return true;
};

ServicePointManager.MaxServicePointIdleTime = 100000;

<hr />
ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
ou en C# 1.1 :

System.Net.ServicePointManager
.CertificatePolicy = new TrustAllCertificatePolicy();
ServicePointManager.MaxServicePointIdleTime = 100000;

<hr />
ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013
0
Merci
Salut,

j'ai ajouté ton code avant le déclenchement de l'exception dans le catch(...), mais rien ne se passe, c'est-à-dire que je n'ai pas d'erreur! Est-ce normal???

Merci pour ton aide

Cédric
Commenter la réponse de Verrisan
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
Re,
mets le code directement dans ta classe

<hr />
ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013
0
Merci
Salut Zebobo5,

Comme j'utilise Visual Studio 2005, j'ai pris le code de ton premier exemple et je l'ai ajouté dans la classe comme suit:


public class ZPKTest : System.Web.Services.WebService
{
    public ZPKTest () {


        //Supprimez les marques de commentaire dans la ligne suivante si vous utilisez des composants conçus 
        //InitializeComponent(); 


        ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors)
 {
     return true;
 };


        ServicePointManager.MaxServicePointIdleTime = 100000;


    }


    [WebMethod]
    public string testCert()
    {


...
 try
 {
...
        string certPath = @"C:\cb\certificat\Test.cer";
...


 classProxy proxy = new classProxy();


.....


 proxy.Url = @"https://....";
 proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certPath));
....
 proxy.chercher(....);
....
 }
 catch (Exception e)
 {
....
 }


        return "OK";


    }
}


En faisant, j'ai toujours l'exception qui est déclenché, dès que la méthdoe chercher est appelée (proxy.cerhcher()), mais le message est différent d'avant.

Dans e.message j'ai ceci:

La demande a échoué avec l'état HTTP 401 : Unauthorized.

Dans InnerException, je n'ai rien car = null.

Est-ce que ma façon de faire est juste! Est-ce que tu aurais une idée!

Par avance, merci beaucoup pour ton aide!

Cédric
Commenter la réponse de Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013
0
Merci
Bonjour tout le monde,

Par rapport au message précédent, j'ai ajouté l'élément NetworkCredential credentials.... comme suit:



public class ZPKTest : System.Web.Services.WebService
{
    public ZPKTest () {


        //Supprimez les marques de commentaire dans la ligne suivante si vous utilisez des composants conçus 
        //InitializeComponent(); 


        ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors)
 {
     return true;
 };


        ServicePointManager.MaxServicePointIdleTime = 100000;


    }


    [WebMethod]
    public string testCert()
    {


...
 try
 {
...
        string certPath = @"C:\cb\certificat\Test.cer";
...


 classProxy proxy = new classProxy();


.....


 proxy.Url = @"https://....";
 proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certPath));
....


NetworkCredential credentials = new NetworkCredential("user1", "mot de passe");
proxy.PreAuthenticate = true;
CredentialCache cache = new CredentialCache();
cache.Add(new Uri("https://..."), "Basic", credentials);
cache.Add(new Uri("https://..."), "Digest", credentials);
cache.Add(new Uri("https://..."), "kerberos", credentials);


params inf = new param(....);
prox.Credentials = cache;


result  res = proxy.chercher(param);
....
 }
 catch (Exception e)
 {
....
 }


        return "OK";


    }
}



Avec ceci, je n'ai plus d'exception qui est déclenchée, mais le contenu de la variable res est null. J'ai vérifier le contenu de la variable param qui contient les différents paramètres, dans XMLSPY qui sont correcte, car ce programme permet aussi d'envoyer des requête SOAP et en l'utilisant, j'arrive avoir des réponse, mais pas depuis le Service Web.

Est-ce quelqu'un connaîtrait la raison pour laquelle cela ne fonctionne depuis mon Service Web?

Par avance, merci beaucoup pour votre aide!

Cédric
Commenter la réponse de Verrisan
0
Merci
Bonjour Verrisan,

pour ma part je n'ai pas d'authentification particulière. Toutefois j'obtiens les mêmes symptômes que toi. Je développe avec VS2013. Mon appel au web service externe est géré dans une librairie, et testé depuis un simple exécutable console. Si j'essaie de faire la même chose à l'intérieur de une web method dans un service web faisant référence à la librairie, aucun résultat, mais aucune erreur explicite. Juste pas de réponse. L'enveloppe constituée est pourtant conforme, comme toi. J'en déduis donc que ton problème est potentiellement autre qu'un problème de certification.
Commenter la réponse de eric