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

Sécurité Java Discussion :

[SSL] Connexion à un webservice via SSL


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Par défaut [SSL] Connexion à un webservice via SSL
    Bonjour,


    Je vous expose mon problème :
    Je dois me connecter à un webservice protégé via SSL + Authentification BASIC.

    Ce client m'a transmit 3 fichiers qui apparemment vont me servir à me connecter via SSL (les certificats apparemment) :
    monfichier-cert.pem
    monfichier-issuer.pem
    monfichier-key.pem


    Voici le code que j'utilise dans mon programme java pour me connecter à ce webservice :

    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
     
    //Valider votre certificat serveur comme sûr
    System.setProperty("javax.net.ssl.trustStore", "chemin du fichier .keystore" );
    System.setProperty("javax.net.ssl.trustStorePassword", "mot_de_passe_du_keystore" );
     
    //Recherche du web service
    MONWSServiceLocator theWS = new ServiceETLServiceLocator();
    theWS.setSIETLEndpointAddress("http://AdresseWeb.com/deMonWS/monWS" );
    MONWSSoapBindingStub monSrv = (MONWSSoapBindingStub) theWS.getMONWS();
     
    //Saisie du login et du pass pour authentification BASIC
    monSrv.setUsername("ici le login" );
    monSrv.setPassword("ici le pass" );
     
    //Appel du web service
    resultat = monSrv.moFonction(mesParam);
    Le problème que je rencontre est le suivant :
    Comment générer ce fichier .keystore nécessaire avec les 3 fichiers que m'a envoyé le client ?

    Dans le cas où je ferais fausse route, pourriez-vous m'expliquer comment me connecter en SSL à ce webservice en utilisant ces 3 fichiers ?

    Vous m'enlèveriez une sacrée épine du pied.

    Merci à tous

  2. #2
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    tu dois tout d'aabord generer le fichier keystore

    - Création des deux certificats client et serveur dans les magasins de clés :
    Lancer l'invite de commande et tapez :
    keytool -genkey -alias Client -keyalg RSA -keystore client_keystore -dname "cn=Client" -keypass password -storepass password

    Puis ceci:
    keytool -genkey -alias Server -keyalg RSA -keystore server_keystore -dname "cn=Server" -keypass password -storepass password
    Avant de démarrer l'application, il faut vérifier que les fichiers keystores et les clés publiques générées en ligne de commande plus haut sont bien au même niveau que l'application a lancé.

  3. #3
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Voici un exemple de serveur implémentant une connexion SSL : il accepte les connexions clientes et reçoit ce que tape le client en ligne de commande:


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    import java.io.*;
    import javax.net.ssl.*;
    import java.security.KeyStore; //necessaire pour la gestion des magasins de clé
     
    class Serveur {
        public static final int PORT = 15000;
        public static final String HOST = "127.0.0.1";
        public static final String KEYSTORE_FILE = "server_keystore";
        public static final String ALGORITHM = "sunx509";
        public static final String PASSWORD = "password";
     
        public static void main(String[] args) {
     
            try {
                SSLServerSocket ecoute = null;
                KeyManagerFactory kmf;
                KeyManager[] km;
                KeyStore ks;
                TrustManagerFactory tmf;
                TrustManager[] tm;
                SSLContext sslc;
                ks = KeyStore.getInstance("JKS");
                ks.load(new FileInputStream(KEYSTORE_FILE), PASSWORD.toCharArray());
                kmf = KeyManagerFactory.getInstance(ALGORITHM);
                kmf.init(ks, PASSWORD.toCharArray());
                km = kmf.getKeyManagers();
                tmf = TrustManagerFactory.getInstance(ALGORITHM);
                tmf.init(ks);
                tm = tmf.getTrustManagers();
                sslc = SSLContext.getInstance("TLS");
                sslc.init(km, tm, null);
                SSLServerSocketFactory ssf = sslc.getServerSocketFactory();
                ecoute = (SSLServerSocket) ssf.createServerSocket(PORT);
                SSLSocket c = (SSLSocket) ecoute.accept();
     
                BufferedReader entree = new BufferedReader(new InputStreamReader(c.getInputStream()));
                while (true) {
                    try {
                        System.out.println(entree.readLine());
                    } catch (IOException e) {
                        System.out.println("Erreur " + e);
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
     
     
    Le client :
     
    import java.io.*;
    import javax.net.ssl.*;
    import java.security.KeyStore;
     
    class Client {
        public static final int PORT = 15000;
        public static final String HOST = "127.0.0.1";
        public static final String KEYSTORE_FILE = "client_keystore";
        public static final String ALGORITHM = "sunx509";
        public static final String PASSWORD = "password";
     
        public static void main(String[] args) {
            try {
                SSLSocket socket = null;
                KeyManagerFactory kmf;
                KeyStore ks;
                TrustManagerFactory tmf;
                SSLContext sslc;
                String line;
     
                kmf = KeyManagerFactory.getInstance(ALGORITHM);
                ks = KeyStore.getInstance("JKS");
                ks.load(new FileInputStream(KEYSTORE_FILE), PASSWORD.toCharArray());
                kmf.init(ks, PASSWORD.toCharArray());
                tmf = TrustManagerFactory.getInstance(ALGORITHM);
                tmf.init(ks);
                sslc = SSLContext.getInstance("TLS");
                sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
                SSLSocketFactory sf = sslc.getSocketFactory();
                socket = (SSLSocket) sf.createSocket(HOST, PORT);
                System.out.println("Client connecte\n");
     
                PrintWriter sortie = new PrintWriter(socket.getOutputStream(), true);
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                while (true) {
                    try {
                        line = br.readLine();
                        sortie.println(line);
                        sortie.flush();
                    } catch (IOException e) {
                        System.out.println("Erreur " + e);
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    Source: CodeGuru

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Par défaut
    J'ai avancé un peu sur la chose :
    J'ai généré le keystore de cette manière :

    keytool -importcert -trustcacerts -alias cer_client -file cert.pem -keystore monkeystore.jks

    keytool -importcert -trustcacerts -alias cer_client2 -file issuer.pem -keystore monkeystore.jks
    A noter que j'ai dûe modifier le fichier "cert.pem" car au début keytool me disait que le fichier n'était pas un certificat valide. Après quelques recherche, j'ai viré la partie "lisible en clair" au début pour ne garder dans le certificat que la partie commençant par "-----------BEGIN CERTIFICATE---------"

    Il me demande de donner un mot de passe à mon keystore ce que je fait.

    En suite si je fait
    keytool -list -keystore monkeystore.jks
    Il me liste bien mon certificat.

    Maintenant, dans mon code, je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.setProperty("javax.net.ssl.trustStore", "c:/monkeystore.jks");
    System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    System.setProperty("javax.net.ssl.trustStorePassword", "mon_mot_de_passe");
    Et ensuite, j'appel le webservice.

    Cependant, j'ai droit à une jolie erreur axis :
    AxisFault
    faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
    faultSubcode:
    faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    faultActor:
    faultNode:
    faultDetail:
    Je dois pas être loin mais toujours pas

    Si quelqu'un passe dans le coin ...

    Merci

    PS : Mais il sert à quoi ce fichier "key.pem" ?

Discussions similaires

  1. Accès WebService via certificat SSL P12
    Par Tequilapaf dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 03/06/2015, 18h07
  2. [AJAX] Connexion au webservice via AJAX
    Par dazine dans le forum AJAX
    Réponses: 1
    Dernier message: 25/03/2014, 14h27
  3. [PasswordRecovery][SSL] envoi d'email via une connexion securisée
    Par TheBlackReverand dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/03/2009, 18h05
  4. Connexion à un webservice via SSL
    Par NoiBe dans le forum Services Web
    Réponses: 10
    Dernier message: 20/11/2007, 18h21
  5. problème de connexion sur un socket SSL
    Par koolway dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/06/2006, 11h20

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