IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

connexion https + certificat + authentification user/login


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut connexion https + certificat + authentification user/login
    Bonjour,

    J'ai un projet dans lequel j'accède à un web service. Cette connexion à récemment évoluée et est basée sur une connexion Https avec certificat et user/ mot de passe.

    Dans un premier temps je ne devais utiliser que le certificat et cela fonctionnait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    String soapRequest = ESBManager.Read(TPL.SOAP_REQUEST);
                    soapRequest = String.Format(soapRequest, orderRequest);
     
                    byte[] buffer = Encoding.ASCII.GetBytes(soapRequest);
     
                    X509Certificate Cert = X509Certificate.CreateFromCertFile(Configuration.GetConfigurationVariable("esb.certificate"));
     
                    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("https://xxxx");
     
                    WebReq.ClientCertificates.Add(Cert);
     
                    //The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
                    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
     
                    // Elargissement du timeout
                    WebReq.Timeout = 300000;
                    //Set the method/action type
                    WebReq.Method = "POST";
                    //We use form contentType
                    WebReq.ContentType = "soap/xml; charset=utf-8";
     
                    //The length of the buffer
                    WebReq.ContentLength = buffer.Length;
     
                    //We open a stream for writing the post  data
                    Stream MyPostData = WebReq.GetRequestStream();
     
                    //Now we write, and after wards, we close. Closing is always important!
                    MyPostData.Write(buffer, 0, buffer.Length);
                    MyPostData.Close();
     
                    //Get the response handle, we have no true response yet!
                    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
     
                    //Now, we read the response (the string), and output it.
                    Stream MyResponse = WebResp.GetResponseStream();
                    StreamReader MyResponseReader = new StreamReader(MyResponse);
     
                    //Read the response Stream and write it
                    String response = MyResponseReader.ReadToEnd();
                    return response;
    Si mon certificat était Ok alors ma requête passait sinon j'avais bien une erreur.

    Depuis je dois tester ma connexion avec le certificat et un user/mot depasse j'ai donc voulu utiliser WebRequest.Credetial en ajoutant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    string esbUser = Configuration.GetConfigurationVariable("esb.user");
                    string esbPassword = Configuration.GetConfigurationVariable("esb.password");
     
                    WebReq.UseDefaultCredentials = false;
                    WebReq.Credentials = new NetworkCredential(esbUser, esbPassword);
    Mais quand je teste peu importe les valeur de user/password ma requête est toujours OK...

    Du coup on me documentant un peu plus sur ce sujet que je ne maîtrise pas je n'ai pas l'impression que les deux solutions existent ensemble mais plutot que c'est soit l'une soit l'autre. Du coup je ne comprend pas la demande d'évolution de ce service.

    Quelqu'un pourrait m'aider à comprendre?

    Cordialement,
    Christophe.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Je n'ai jamais eu à gérer ce type de web service, mais à vue d'oeil je pense qu'il faut définir deux bindings distincts : un pour l'auth par login/mot de passe, et l'autre pour l'auth par certificat.

    Ensuite c'est au client de définir quel est le type de binding à utiliser en fonction de la méthode d'authentification choisie.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Bonjour,

    En fait je ne peux configurer le service auquel j'accède on m'a simplement remis un certificat et un login/password.

    En fait par rapport à mon dernier message, dans mon code j'ai une ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
    Qui semble être une simple rustine pour passer outre les erreurs de validation mais ce n'est pas ce que je veux.

    Donc pour commencer j'ai surtout un grand flou sur l'utilisation d'un certificat publique.

    Lorsque en utilisant l'outil mmc.exe, pour que ma requête sur mon service passe (sans déclarer de certificat dans le code) je dois installer celui-ci au niveau des "Autorités de certificats racine de confiance" sur ma machine locale.

    J'essaye après coup de le faire via le code:

    1-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
                    X509Certificate cert = X509Certificate.CreateFromCertFile(Configuration.GetConfigurationVariable("esb.certificate"));
                    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("https://");
                    WebReq.ClientCertificates.Add(cert);
     
                    WebReq.Timeout = 300000;
                    //Set the method/action type
                    WebReq.Method = "POST";
                    //We use form contentType
                    WebReq.ContentType = "soap/xml; charset=utf-8";
     
                    //The length of the buffer
                    WebReq.ContentLength = buffer.Length;
     
                    //We open a stream for writing the post  data
                    Stream MyPostData = WebReq.GetRequestStream();
    J'obtient lune erreur de validation:
    The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

    Du coup en cherchant un peu j'essaye de stocker mon certificat au bon endroit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
                    X509Certificate2 cert = new X509Certificate2(Configuration.GetConfigurationVariable("esb.certificate"));
                    X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
     
                    store.Open(OpenFlags.ReadWrite);
                    store.Add(cert);
                    store.Close();
     
                    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("https://=");
     
                    WebReq.Timeout = 300000;
                    //Set the method/action type
                    WebReq.Method = "POST";
                    //We use form contentType
                    WebReq.ContentType = "soap/xml; charset=utf-8";
     
                    //The length of the buffer
                    WebReq.ContentLength = buffer.Length;
     
                    //We open a stream for writing the post  data
                    Stream MyPostData = WebReq.GetRequestStream();
    Mais j'ai une erreur de droit sur ma machine Locale.

    Et si je me contente de StoreLocation.CurrentUser dans le code précédent j'ai de nouveau l'erreur de validation comme si je n'avais pas déclaré de certificat.

    Quelqu'un pourrait-il m'aider à comprendre la bonne utilisation de ces certificats? qu'est-ce que j'oubli de faire?

    Cordialement.

Discussions similaires

  1. Connection HTTP 1.1 en TCP/IP et Proxy Orange
    Par Khertan dans le forum Développement
    Réponses: 1
    Dernier message: 24/08/2006, 11h11
  2. Connections http
    Par argister dans le forum Langage
    Réponses: 1
    Dernier message: 24/10/2005, 18h55
  3. [J2EE][JAAS]Detecter la connection d'un user
    Par SEMPERE Benjamin dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 27/06/2005, 20h51
  4. [Tomcat] Nombre de connection HTTP
    Par bahamouth dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 30/01/2004, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo