web-dev-qa-db-fra.com

Exemple de SOAP authentifiée avec WS-UsernameToken

J'essaie d'authentifier une SOAP à l'aide de la spécification WS-UsernameToken, mais le périphérique cible refuse toujours l'accès. Ma demande qui ne fonctionne pas ressemble à ceci. (Le mot de passe que j'essaie de le hachage est system.)

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
 <Header>
  <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <UsernameToken>
      <Username>root</Username>
      <Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">EVpXS/7yc/vDo+ZyIg+cc0fWdMA=</Password>
      <Nonce>tKUH8ab3Rokm4t6IAlgcdg9yaEw=</Nonce>
      <Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2010-08-10T10:52:42Z</Created>
    </UsernameToken>
  </Security>
 </Header>
  <Body>
    <SomeRequest xmlns="http://example.ns.com/foo/bar" />
  </Body>
</Envelope>

Ce que je recherche est un exemple de demande similaire, mais avec un jeton d'authentification qui fonctionne réellement. Par exemple, si vous avez une application gSOAP qui utilise ces jetons et peut générer une demande et publier le résultat ici, je vous en serais très reconnaissant.

21
che

L'essentiel est de définir des préfixes pour les espaces de noms et de les utiliser pour fortifier chaque balise - vous mélangez 3 espaces de noms et cela ne marche tout simplement pas en essayant de pirater les valeurs par défaut. Il est également bon d'utiliser exactement les préfixes utilisés dans le standard do c - juste au cas où l'autre côté deviendrait un peu bâclé.

Enfin, il est préférable d'utiliser les types par défaut pour les champs chaque fois que vous le pouvez - donc pour le mot de passe, vous devez répertorier le type, pour le Nonce, c'est déjà Base64.

Assurez-vous de vérifier que le jeton généré est correct avant de l'envoyer via XML et n'oubliez pas que le contenu de wsse: le mot de passe est Base64 (SHA-1 (nonce + créé + mot de passe)) et la date et l'heure en wsu: Créé peut facilement vous gâcher. Donc, une fois que vous avez corrigé les préfixes et les espaces de noms et vérifié que votre SHA-1 fonctionne correctement sans XML (imaginez simplement que vous validez la demande et effectuez le côté serveur du calcul SHA-1), vous pouvez également faire un vrai sans création et même sans Nonce. Oh et Nonce peuvent avoir des encodages différents, donc si vous voulez vraiment forcer un autre encodage, vous devrez regarder plus loin dans l'espace de noms wsu.

<S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
  <S11:Header>
  ...
    <wsse:Security>
      <wsse:UsernameToken>
        <wsse:Username>NNK</wsse:Username>
        <wsse:Password Type="...#PasswordDigest">weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==</wsse:Password>
        <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
        <wsu:Created>2003-07-16T01:24:32</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  ...
  </S11:Header>
...
</S11:Envelope>
19
ZXX

Les prise en charge du mot de passe de hachage et paramètres d'assertion de jeton dans Metro 1.2 explique très bien à quoi ressemble un jeton de nom d'utilisateur avec un mot de passe de résumé:

Prise en charge du mot de passe Digest

Profil de jeton de nom d'utilisateur WSS 1.1 permet aux mots de passe condensés d'être envoyés dans un wsse:UsernameToken d'un message SOAP. Deux autres éléments facultatifs sont inclus dans le wsse:UsernameToken dans ce cas: wsse:Nonce et wsse:Created. Un nonce est une valeur aléatoire que l'expéditeur crée pour inclure dans chaque UsernameToken qu'il envoie. Un temps de création est ajouté pour combiner les nonces à une période de "fraîcheur". Le résumé des mots de passe dans ce cas est calculé comme suit:

Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )

Voici à quoi ressemble un UsernameToken avec Digest Password:

<wsse:UsernameToken wsu:Id="uuid_faf0159a-6b13-4139-a6da-cb7b4100c10c">
   <wsse:Username>Alice</wsse:Username>
   <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">6S3P2EWNP3lQf+9VC3emNoT57oQ=</wsse:Password>
   <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">YF6j8V/CAqi+1nRsGLRbuZhi</wsse:Nonce>
   <wsu:Created>2008-04-28T10:02:11Z</wsu:Created>
</wsse:UsernameToken>
9
Pascal Thivent

Vérifiez celui-ci (le mot de passe doit être le mot de passe):

<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-6138db82-5a4c-4bf7-915f-af7a10d9ae96">
  <wsse:Username>user</wsse:Username>
  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">CBb7a2itQDgxVkqYnFtggUxtuqk=</wsse:Password>
  <wsse:Nonce>5ABcqPZWb6ImI2E6tob8MQ==</wsse:Nonce>
  <wsu:Created>2010-06-08T07:26:50Z</wsu:Created>
</wsse:UsernameToken>
4
Ladislav Mrnka

Peut-être ce message ( Secure Web JAX-WS UsernameToken Web Service with Signature, Encryption and TLS (SSL) ) fournit plus d'informations. Comme ils l'ont mentionné "N'oubliez pas, à moins que le texte du mot de passe ou le mot de passe digéré ne soit envoyé sur un canal sécurisé ou que le jeton ne soit crypté, ni le résumé du mot de passe ni le mot de passe en texte clair n'offrent une réelle sécurité supplémentaire."

1
James Matt