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

Services Web Java Discussion :

Appeler un web service en passant un certificat X509


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Par défaut Appeler un web service en passant un certificat X509
    Bonjour,

    Je dois appeler un web service pour lequel j'ai reçu le wsdl, un certificat d'authentification xxx.cer et deux certificats de certification gov.crt et belgium.crt. J'ai importé ces certificats dans le fichier cacerts de mon runtime java. Via netbeans, j'ai ajouté un web service client à partir du wsdl et ensuite, dans une classe, j'ai fait un call service operation. Mais il semblerait que le certificat ne soit pas passé au server. J'ai alors importé ces certificats dans un autre keystore dans un répertoire temporaire et ai ajouté, en début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    System.setProperty("javax.net.ssl.keyStore", "C:\\Temp\\cacerts.test");
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
    System.setProperty("javax.net.ssl.trustStore", "C:\\Temp\\cacerts.test");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    mais cela ne change rien. De même si j'indique le fichier cacerts du runtime java.

    Ma question est donc : comment appeler le web service en m'identifiant avec mon certificat ? Et comment obtenir l'enveloppe Soap à partir du code généré dans netbeans ?

    Merci pour vos réponses.

  2. #2
    Membre confirmé
    Homme Profil pro
    responsable technique
    Inscrit en
    Novembre 2002
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : responsable technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 100
    Par défaut
    bonjour, j'ai le même problème que toi (j'utilise JAX-WS).
    As-tu trouvé une solution ?
    MErci
    a bientôt

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Par défaut
    Bonjour,

    Je n'ai toujours pas trouvé la solution. Je pensais qu'il s'agissait d'un problème de format car j'ai généré ma clé et mon csr par openssl, et utilisé keytool pour importer le certificat. J'ai converti ma clé et mon cer en pkcs12 pour les importer dans un keystore et ai également fait le test via pkcs8, mais cela ne change rien.

    Si tu trouve la solution avant moi, tu peux me la donner ?


    Merci.

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Février 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 1
    Par défaut
    Bonjour,

    Je rencontre le même problème, avez-vous trouvé une solution ?

    Merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Par défaut
    Afin de pouvoir signer l'enveloppe SOAP envoyée, nous avons utilisé Axis2 et son outil wsdl2java :

    axis2-1.5.1\bin\wsdl2java -u -p mypackage.axis -uri C:\service.wsdl


    Nous avons ainsi obtenu des classes java et les stubs. Nous avons créé une classe utilitaire pour signer les enveloppe :

    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
     
    import java.util.List;
    import java.util.Vector;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.apache.axiom.soap.SOAPEnvelope;
    import org.apache.axis2.saaj.util.SAAJUtil;
    import org.apache.ws.security.SOAPConstants;
    import org.apache.ws.security.WSConstants;
    import org.apache.ws.security.WSEncryptionPart;
    import org.apache.ws.security.WSSecurityEngine;
    import org.apache.ws.security.components.crypto.Crypto;
    import org.apache.ws.security.components.crypto.CryptoFactory;
    import org.apache.ws.security.message.WSSecHeader;
    import org.apache.ws.security.message.WSSecSignature;
    import org.apache.ws.security.util.WSSecurityUtil;
    import org.w3c.dom.Document;
     
    public class SOAPUtil {
     
        private Crypto crypto = CryptoFactory.getInstance("crypto.properties");
        private WSSecurityEngine secEngine = new WSSecurityEngine();
     
        public SOAPEnvelope signSOAPEnvelope(SOAPEnvelope unsignedEnvelope) {
            try {           
                WSSecSignature signer = new WSSecSignature();
                String alias = "alias";
                String password = "password";
                signer.setUserInfo(alias, password);
                signer.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
     
                // The "build" method, creates the signed SOAP envelope.
                // It takes a SOAP Envelope as a W3C Document and adds
                // a WSS Signature header to it. The signed elements
                // depend on the signature parts that are specified by
                // the WSBaseMessage.setParts(java.util.Vector parts)
                // method. By default, SOAP Body is signed.
                // The "crypto" parameter is the object that implements
                // access to the keystore and handling of certificates.
                // A default implementation is included:
                //    org.apache.ws.security.components.crypto.Merlin
                Document doc = SAAJUtil.getDocumentFromSOAPEnvelope(unsignedEnvelope);
                SOAPConstants soapConstants = WSSecurityUtil.getSOAPConstants(doc.getDocumentElement());
                // Création de la base du Header de sécurité
                WSSecHeader secHeader = new WSSecHeader();
                secHeader.insertSecurityHeader(doc);
                // Parties à signer : "SyncHeader" et "soapenv:Body"
                List parts = new Vector();
                WSEncryptionPart encP = new WSEncryptionPart(soapConstants.getBodyQName().getLocalPart(), soapConstants.getEnvelopeURI(), "");
                parts.add(encP);
                signer.setParts((Vector) parts);
                Document signedDoc = signer.build(doc, crypto, secHeader);
                //Info ==> afficher la chaîne résultat
                String outputMsg = org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(signedDoc);
                Logger.getLogger(Main.class.getName()).log(Level.INFO, "OK! Enveloppe signée=" + outputMsg);
                // Création de l'enveloppe SOAP signée
                SOAPEnvelope signedSOAPEnv = SAAJUtil.getSOAPEnvelopeFromDOOMDocument(signedDoc);
                return signedSOAPEnv;
            } catch (Exception ex) {
                Logger.getLogger(SOAPUtil.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }
        }
    }

    Dans le stub généré, pour chaque méthode, il faut ajouter la signature entre addHeadersToEnvelope et setEnvelope :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                //adding SOAP soap_headers
                _serviceClient.addHeadersToEnvelope(env);         
    
                // ajout de la signature
                SOAPUtil soapUtil = new SOAPUtil();
                env = soapUtil.signSOAPEnvelope(env);
    
                // set the message context with that soap envelope
                _messageContext.setEnvelope(env);
    Et le fichier crypto.properties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
    org.apache.ws.security.crypto.merlin.keystore.type=jks
    org.apache.ws.security.crypto.merlin.keystore.password=password
    org.apache.ws.security.crypto.merlin.file=keys/mykeystore.keystore
    Il y a peut-être une meilleure façon de faire, pour par exemple automatiquement signer chaque requête sans devoir ajouter les lignes de signature dans chaque méthode, mais je n'ai pas encore chercher. Si d'autres personnes ont résolu ce problème, la solution est la bienvenue.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler un web service avec pl/sql
    Par squalito dans le forum PL/SQL
    Réponses: 5
    Dernier message: 17/09/2012, 15h21
  2. Appels de Web services (SOAP) ?
    Par ovdbc dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 17/10/2007, 11h28
  3. [Web Services] Appel de Web Service (pb avec authentification)
    Par cicolas dans le forum Spring
    Réponses: 4
    Dernier message: 04/07/2006, 10h20
  4. [Débutant] Appeler un Web Service
    Par slyer dans le forum Services Web
    Réponses: 2
    Dernier message: 17/02/2006, 18h15

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