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 :

SOAP et WS-Security


Sujet :

Sécurité Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut SOAP et WS-Security
    Bonjours,
    Donc mon probleme est le suivant je souhaite securiser une requette SOAP avec la specification WS-Security de OASIS.
    J'ai trouvé l'api xws-security qui doit pouvoir le faire mais quand je veux signé ma requette il me demande un clef privé et malheureusement je souhaite le signé avec une clef public car j'utilise un certificat.
    Mon code si sa peu aider:
    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
     
    String fileName = "C:/BodyXML.xml";
    String signatureFileName = "C:/enveloped-6.xml";
     
    		try {
     
    			//This code select a P12 certificate for the signature
    			String certificateName = "8033_prv";
    			String certificatePath = "C:/8033_prv.p12";
     
    			//Create KeyStore
    			KeyStore ks = KeyStore.getInstance("PKCS12");
    			char[] password = certificateName.toCharArray();
    			ks.load(new FileInputStream(certificatePath), password);
     
    			//Create KeyEntry
    			KeyStore.PrivateKeyEntry keyEntry = 
    				(KeyStore.PrivateKeyEntry) ks.getEntry
    					(certificateName, new KeyStore.PasswordProtection
    							(certificateName.toCharArray()));
     
    			//Create certificate
    			X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
     
    			// Initialize the apache libraries
    			Init.init();
     
    			// Obtain security elements from the keystore
    			//PrivateKey privateKey = MySecurityUtils.getPrivateKey();
    			//PrivateKey privateKey = keyEntry.getPrivateKey();
    			PublicKey privateKey = cert.getPublicKey();
    			//PrivateKey privateKey = (PrivateKey) cert.getPublicKey();
    			//X509Certificate cert = MySecurityUtils.getCertificate();
     
                              MessageFactory mf = MessageFactory.newInstance();
                              MimeHeaders headers = new MimeHeaders();
                              headers.addHeader("Content-Type", null);
                              SOAPMessage message = mf.createMessage(headers, new FileInputStream(filePath));
    		message.saveChanges();
    			SOAPHeader header = message.getSOAPHeader();
    			SOAPBody body = message.getSOAPBody();
     
    			// Set the wsu:Id attribute to the Body
    			//XMLUtil.setWsuIdAttr(body, "MyId");
    			XMLUtil.setWsuIdAttr(body, "id-2");
     
    			// Create a WSSE context for the SOAP message
    			SecurableSoapMessage sssm = new SecurableSoapMessage(message);
     
    			// Create a security header for the message (<wsse:Security>)
    			SecurityHeader sh = sssm.findOrCreateSecurityHeader();
     
    			// Insert the certificate (<wsse:BinarySecurityToken>)
    			//X509SecurityToken stoken = new X509SecurityToken(header.getOwnerDocument(), cert, "X509TokenRef");
    			X509SecurityToken stoken = new X509SecurityToken(header.getOwnerDocument(), cert);
    			sh.insertHeaderBlock(stoken);
     
    			// Insert the keyinfo referring to the certificate (<ds:KeyInfo>)
    			KeyInfoHeaderBlock kihb = new KeyInfoHeaderBlock(header.getOwnerDocument());
    			SecurityTokenReference secTR = new SecurityTokenReference(header.getOwnerDocument());
    			DirectReference dirRef = new DirectReference();
    			dirRef.setURI("#X509TokenRef");
    			secTR.setReference(dirRef);
    			kihb.addSecurityTokenReference(secTR);
    			//sh.insertHeaderBlock(kihb);
     
    			// Insert the Signature block (<ds:Signature>)
    			SignatureHeaderBlock shb = new SignatureHeaderBlock(header.getOwnerDocument(), XMLSignature.ALGO_ID_SIGNATURE_RSA);
    			Transforms transforms = new Transforms(header.getOwnerDocument());
    			transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
     
    			//shb.addSignedInfoReference("#MyId", transforms, Constants.ALGO_ID_DIGEST_SHA1);
    			shb.addSignedInfoReference("id-2", transforms, Constants.ALGO_ID_DIGEST_SHA1);
    			shb.addChildElement(kihb.getAsSoapElement());
    			sh.insertHeaderBlock(shb);
     
    			// Digest all References (#MyId) in the SignedInfo, calculate the signature value
    			// and set it in the SignatureValue Element
    			javax.swing.JOptionPane.showMessageDialog(null, "PublicKey : "+privateKey.toString());
    			shb.sign(privateKey);
     
    			// Add the signature data to the header element
    			header.addChildElement(sh.getAsSoapElement());
     
    			// Save the signed SOAP message
    			FileOutputStream fos = new FileOutputStream(new File(signatureFileName));
    			message.writeTo(fos);
     
    		} catch (Exception exc) {
    			exc.printStackTrace();
    			//System.out.println("An error has occurred : " + exc.toString());
    			javax.swing.JOptionPane.showMessageDialog(null, "Erreur : "+exc);
    		}
    Donc c cette ligne qui bloque: shb.sign(privateKey);
    Apres si se sont mes methodes qui ne sont pas bien utilisé ..
    Je suis preneur de toutes aides
    MERCI

  2. #2
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2005
    Messages : 4 413
    Points : 18 468
    Points
    18 468
    Par défaut
    J'ai trouvé l'api xws-security qui doit pouvoir le faire mais quand je veux signé ma requette il me demande un clef privé et malheureusement je souhaite le signé avec une clef public car j'utilise un certificat.
    Une signature électronique est le chiffrement du hash du message à signer avec la clef privée et pas publique.

    En résumé :
    Chiffrement
    L'émetteur utilise la clef publique du destinataire pour chiffrer un message à envoyer et le destinataire utilise la clef privée correspondante pour déchiffrer.
    Signature Électronique
    L'émetteur utilise sa clef privée pour signer un message à destination de n'importe qui et le destinataire utilise la clef publique de l'émetteur pour vérifier la signature.

    D'où les questions suivantes :

    D'où sort ce certificat ? Est-il généré à la volée par un autre programme ? Dépend-t-il d'une autorité de certification spécifique (genre Verisign) ?

    Tu utilises un PKCS12 (un magasin) pour sortir ton certificat donc je suppose qu'il existe déjà. Un PKCS12 peut tout a fait contenir la clef publique et la clef privée.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Déjà merci de m'aider.
    Mon certificat ma été fournie par le distributeur du web service avec qui je tente de communiquer.
    Il est bien d'extension "p12" mais je ne sais pas si il contient une clef privé.
    Sinon je ne sais pas ou recupérer cette clef privé car l'objet X509Certificate ne me propose pas de getPrivateKey. Il y a bien le keyStore.getPrivateKey mais celui ci me retourne un null.
    Avant j'utilisai l'objet javax.xml.crypto.dsig.XMLSignature qui utilise la clef public du certificat pour signer le xml mais cette classe ne permet pas d'obtenir un fichier respectant la WS-Security specification.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    J'ai reussi a obtenir une clef privé en ajoutant le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PrivateKey privateKey = keyEntry.getPrivateKey();
    Je vais essayer avec sa.

  5. #5
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2005
    Messages : 4 413
    Points : 18 468
    Points
    18 468
    Par défaut
    Les clefs sont identifiées à l'intérieur d'un fichier p12 par des index alphanumériques. Demande à ton fournisseur comment récupérer la clef privée pour signer.

    On signe avec une clef privée, pas avec une clef publique, j'en suis sûr et certain
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    J'ai compris pas de soucis mais je galère a la recuperer cette clef privé.
    KeyEntry.getPrivateKey(); me retourne ma clef mais ma ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    javax.swing.JOptionPane.showMessageDialog(null, "PublicKey : "+privateKey.toString());
    		shb.sign(privateKey);
    me retourne un null expression alors que le showMessageDialog m'affiche la valeur de la clef je suis perdu.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Mon probleme n'est toujours pas resolu.
    J'ai finalement reussi a signer mon XML mais la valeur retourné par le
    <DigestValue> n'est pas bonne. J'ai effeectuer des tests avec SOAPUI qui fonctionne et la valeur de digest produit par SOAPUI est differante de celle que j'obtient avec la librairie xws-security si quelqu'un a une idée je suis preneur.
    Merci.

  8. #8
    Membre à l'essai
    Femme Profil pro
    ENIG
    Inscrit en
    février 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ENIG

    Informations forums :
    Inscription : février 2014
    Messages : 22
    Points : 21
    Points
    21
    Par défaut SOAP et WS-Security
    Salut,
    j'ai comme sujet pfe sécuriser des services web SOAP et parmi ces services un se nomme WS-Authentification en utilisant ws-security et X509Token(certificat) je travaille avec Axis2 sous j2ee mon problème est comment procéder au début est ce que je dois manipuler moi meme les messages SOAP et comment faire mon code java et merci d'avance

  9. #9
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : mai 2004
    Messages : 471
    Points : 647
    Points
    647
    Par défaut
    Bonjour,

    Les différentes API SOAP proposent chacune une implémentation de WS-Security leur correspondant.

    Pour Axis2, il s'agit de http://axis.apache.org/axis2/java/rampart/
    Le mieux est donc de suivre la doc de rampart qui devrait t'expliquer comment mettre WS-Security en oeuvre pour des services SOAP en Axis2.

Discussions similaires

  1. WCF WS-Security : Comment signer un "SOAP REQUEST"
    Par PEEFA dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 04/04/2015, 11h27
  2. Ajouter un header security dans une requete SOAP
    Par cyclopsnet dans le forum Services Web
    Réponses: 5
    Dernier message: 23/10/2014, 16h41
  3. web service - soap security header - binding configuration
    Par Tiwaz dans le forum Services Web
    Réponses: 1
    Dernier message: 26/12/2013, 10h35
  4. [SOAP UI]Test avec username et ws-security
    Par Nanais19 dans le forum Services Web
    Réponses: 0
    Dernier message: 12/04/2013, 16h01
  5. Appel SOAP avec ws-addressing, ws-security et consorts
    Par cedricgirard dans le forum Langage
    Réponses: 0
    Dernier message: 15/03/2013, 16h11

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