2012-05-14 2 views
2

gars, pleeaseee aidez-moi !!!Consommer un service web avec usernametoken profil avec pwd digest

J'ai créé un service web qui utilise UserNameToken Profile security avec un type de mot de passe comme 'digest'. Quand j'essaie d'utiliser le webservice de SOAP-UI (en envoyant l'information dans la tête du xml) je peux consommer le webservice normalement, mais quand j'essaye de consommer ce webservice avec JAVA le serveur n'authentifie pas l'utilisateur.

J'essaie d'utiliser l'axe et JAX-WS (envoyer les informations dans la tête de l'enveloppe-like SOAP-UI) mais le serveur n'authentifie pas l'utilisateur.

Quelqu'un peut-il m'aider?

Voici mon code:

public void faz() throws NoSuchAlgorithmException, Exception { 

    ///////////////////////////////////////////////////////////// 
    //get the timestamp, nonce and password in SHA-1 and BASE64//  
    ///////////////////////////////////////////////////////////// 


    String nonce, timestamp, secret; 
    nonce = String.valueOf(this.hashCode()); 
    BASE64Encoder encoder2 = new BASE64Encoder(); 
    nonce = encoder2.encode(nonce.getBytes()); 
    Calendar c = Calendar.getInstance(); 
    c.setTime(new Date()); 

    timestamp = DatatypeConverter.printDateTime(c); 
    timestamp = timestamp.substring(0, 19); 
    timestamp = timestamp+"Z"; 
    secret = "weblogic1"; 
    MessageDigest SHA1 = null; 
    try { 
     SHA1 = MessageDigest.getInstance("SHA1"); 
    } catch (NoSuchAlgorithmException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    ; 

    String beforeEncryption = nonce + timestamp + secret; 
try { 

     SHA1.reset(); 
     byte[] toEncrypt = beforeEncryption.getBytes("UTF-8"); 
     SHA1.update(beforeEncryption.getBytes()); 
    } catch (UnsupportedEncodingException uee) { 
     throw new RuntimeException(uee); 
    } 

    byte[] encryptedRaw = SHA1.digest(); 
    byte[] encoded = Base64.encodeBase64(encryptedRaw); 
    MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
    digest.update("password".getBytes()); 
    BASE64Encoder encoder = new BASE64Encoder(); 
    String senha = encoder.encode(digest.digest()); 
    System.err.println(senha); 
    //////////////////////////////////// 
    //////////END //////////////////////   
    //////////////////////////////////// 

    CalculaServiceService ss = new CalculaServiceServiceLocator(); 

    CalculaService service = ss.getCalculaServicePort(); 

    String uri = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 
    String uriCrea = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; 

    SOAPHeaderElement securityE = new SOAPHeaderElement(uri, "Security", 
      null); 
    SOAPHeaderElement tokenE = new SOAPHeaderElement(uri, "UsernameToken", 
      null); 
    SOAPHeaderElement userE = new SOAPHeaderElement(uri, "Username", null); 
    tokenE.setObjectValue(null); 


    securityE.setObjectValue(null); 


    userE.setValue("username"); 
    SOAPHeaderElement pwdE = new SOAPHeaderElement(uri, "Password", null); 
    pwdE.addAttribute(uri, "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"); 
    pwdE.setValue(senha); 

    SOAPHeaderElement nonceE = new SOAPHeaderElement(uri, "Nonce", null); 
    nonceE.addAttribute(uri, "EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"); 
    nonceE.setValue(nonce); 

    SOAPHeaderElement createdE = new SOAPHeaderElement(uriCrea, "Created", null); 
    createdE.setValue(timestamp); 




    tokenE.addChildElement(userE); 
    tokenE.addChildElement(pwdE); 
    tokenE.addChildElement(nonceE); 
    tokenE.addChildElement(createdE); 
    securityE.addChildElement(tokenE); 
    ((Stub) service).setHeader(securityE); 
    service.calcula(13, 10, "somar"); 
} 

Répondre

3

norme WS-Security définit le mot de passe digest en base64 (SHA-1 (+ créé + nonce mot de passe)).

Vous reflétez cela correctement en hachant le contenu de la variable beforeEncryption et stocker le résultat encryptedRaw puis base64 encode à codées variables. Jusqu'ici tout va bien. Mais la variable codée n'est utilisée nulle part. Pour une raison quelconque, vous calculez un second condensé base64 (sha1 ("mot de passe")) et le stockez à la variable senha qui sera utilisée plus tard pour remplir l'élément WSS Password.

supprimer complètement le code qui calcule la seconde digestion et utiliser le contenu de la variable codée:

Conceptuellement, changer le pwd.setValue() à partir de:

pwdE.setValue(senha) 

A:

pwdE.setValue(encoded) 

et assurez-vous que la variable codée sera une chaîne, pas un tableau d'octets.

En outre, vous devez envisager d'utiliser une meilleure valeur pour nonce qu'un code de hachage d'objet.

+0

Ok. Merci Matej. Je vais tester cela et signaler ici .... –

+0

D'accord ... ne fonctionne pas, maintenant je reçois cette erreur: Message plus ancien que permis MessageAge. Peut-être que la configuration du serveur est incorrecte? Je vais le voir. Des idées?? –

+0

Lignes timestamp = timestamp.substring (0, 19); et timestamp = horodatage + "Z"; puanteur. En ajoutant le "Z" à la fin, vous spécifiez que la valeur de l'heure est dans le fuseau horaire UTC. Essayez d'utiliser l'horodatage tel quel s'il contient le fuseau horaire ou spécifiez GMT TZ lors de la création de l'objet de calendrier. Si l'heure formatée est dans un fuseau horaire différent de celui de l'heure UTC, vous obtiendrez du temps dans le passé (si vous êtes en avance) ou dans le futur. Vous devez vous assurer que vous utiliserez la valeur de temps correcte (dans la période de fraîcheur), sinon le serveur rejette la tentative d'authentification comme une attaque de rejeu. Voir la spécification du profil UsernameToken, p7. – Matej

Questions connexes