2009-12-11 8 views
10

350 Bounty et des gaufres à la personne qui peut me aider!Décryptage du message avec un service Web client Spring

J'ai lutté avec Spring cryptage du service Web pour les jours et je ne peux pas comprendre comment faire pour que le cryptage de Spring sur le corps du message fonctionne. Chaque fois que le serveur crypte le message résultant, le client ne semble pas le décrypter avant de tenter de le valider par rapport au schéma (XSD).

Here is the server side configuration

The server's xwss security configuration

The client's Spring configuration

Client's xwss configuration

Ce que je peux faire est de chiffrer le jeton utilisateur et décrypter avec succès. Je fais cela lors de l'envoi de données du client au serveur. Le serveur déchiffre ensuite le jeton d'utilisateur et authentifie les informations d'identification de l'utilisateur, ce qui fonctionne assez bien.

Le problème se produit si j'essaie de chiffrer le corps du message qui revient. Le problème se produit du côté du client. Il semble que le client essaie de valider le message avant de le décrypter, et qu'une erreur survient lors de la validation par rapport au schéma.

[Fatal Error] :1:192: The prefix "ns0" for element "ns0:HolidayListResponse" is not bound. 
11-Dec-2009 7:45:32 AM com.sun.xml.wss.impl.apachecrypto.DecryptionProcessor decryptElementWithCipher 
SEVERE: WSS1203: Exception [ The prefix "ns0" for element "ns0:HolidayListResponse" is not bound. ] while trying to decrypt message 

And here is the SOAP response itself.

Et voici le fichier de mappage de triage

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" 
         "http://castor.org/mapping.dtd"> 
<mapping> 
    <field-handler name="dateHandler" class="com.mycompany.hr.handlers.DateFieldHandler" /> 
    <field-handler name="dateHandler2" class="com.mycompany.hr.handlers.DateFieldHandler" /> 
    <class name="com.mycompany.hr.data.Holiday"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="Holiday" /> 
     <field name="from" type="string" handler="dateHandler"> 
      <bind-xml name="StartDate" node="element" /> 
     </field> 
     <field name="to" type="string" handler="dateHandler2"> 
      <bind-xml name="EndDate" node="element" /> 
     </field> 
    </class> 
    <class name="com.mycompany.hr.data.Employee"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="Employee" /> 
     <field name="number" type="java.lang.Integer"> 
      <bind-xml name="Number" node="element" /> 
     </field> 
     <field name="firstName" type="java.lang.String"> 
      <bind-xml name="FirstName" node="element" /> 
     </field> 
     <field name="lastName" type="java.lang.String"> 
      <bind-xml name="LastName" node="element" /> 
     </field> 
    </class> 
    <class name="com.mycompany.hr.data.HolidayRequest"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="HolidayRequest" /> 
     <field name="holiday" type="com.mycompany.hr.data.Holiday"> 
      <bind-xml name="Holiday" node="element" /> 
     </field> 
     <field name="employee" type="com.mycompany.hr.data.Employee"> 
      <bind-xml name="Employee" node="element" /> 
     </field> 
    </class> 

    <class name="com.mycompany.hr.data.HolidayConfirmation"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="HolidayConfirmation" /> 
     <field name="confirmationCode" type="java.lang.Integer"> 
      <bind-xml name="ConfirmationCode" node="element" /> 
     </field> 
     <field name="confirmationMessage" type="java.lang.String"> 
      <bind-xml name="ConfirmationMessage" node="element" /> 
     </field> 
    </class> 

    <class name="com.mycompany.hr.data.HolidayResponse"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="HolidayResponse" /> 
     <field name="confirmation" type="com.mycompany.hr.data.HolidayConfirmation"> 
      <bind-xml name="HolidayConfirmation" node="element" /> 
     </field> 
    </class> 
    <class name="com.mycompany.hr.data.HolidayListRequest"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="HolidayListRequest" /> 
     <field name="id" type="java.lang.Integer"> 
      <bind-xml name="userId" node="element" /> 
     </field> 
    </class> 
    <class name="com.mycompany.hr.data.HolidayListResponse"> 
     <map-to ns-uri="http://mycompany.com/hr/schemas" ns-prefix="ns0" xml="HolidayListResponse" /> 
     <field name="holidays" type="com.mycompany.hr.data.Holiday" collection="vector"> 
      <bind-xml name="Holiday" node="element" /> 
     </field> 
    </class> 
</mapping> 

Je sais qu'il est beaucoup d'informations, mais je pensais que je voudrais tout donner. Ma configuration de chiffrement est-elle correcte? N'est-il pas possible de crypter le corps du message et de le déchiffrer du côté client? À ce stade, je suis ouvert à presque n'importe quelle suggestion.

+0

vous avez toujours pas donné l'information tout;) Donnez la pleine stacktrace (ou au moins couper à un endroit significatif, pas le début) – Bozho

+0

C'est tout ce que je reçois pour une erreur. Je n'ai pas toute trace de pile. La trace de la pile que j'obtiens essaie de valider le message contre le XSD, ce qui ne fonctionnera pas sur les données cryptées. – Zoidberg

+0

Il semble que DecryptionProcessor souhaite connaître le schéma de ce qu'il déchiffre, mais ne le fait pas. Dans print xml de votre client, je ne vois pas les références "schema" utilisées quelque part ... –

Répondre

0

Êtes-vous certain

<property name="xsd" value="classpath:src/java/hr.xsd"/> 

est en voie de résolution correctement?

L'erreur que vous obtenez indique qu'il ne peut pas trouver comment gérer cet élément. Vous ne verriez pas le nom et le préfixe de l'élément si la réponse n'était pas déchiffrée.

Êtes-vous en mesure de valider et d'exécuter le service Web sans cryptage?

+0

Oui, je suis capable de l'exécuter avec succès sans cryptage. Il sait à propos de ns0: HolidayListResponse parce que le schéma l'oblige à être l'élément de premier niveau dans la réponse, mais le message est chiffré, donc il ne voit pas cet élément de premier niveau. En ce qui concerne la propriété xsd, oui, elle se résout correctement, les chemins de démarrage à ressort sont directement à partir du chemin de classe. J'ai essayé de changer le chemin et j'obtiens une erreur au démarrage s'il ne trouve pas le fichier XSD. – Zoidberg

2

Jetez un coup d'œil aux propriétés CastorMarshaller, et essayez de définir certaines des valeurs "ignorantes" à true (dans <bean id="castorMarshaller"). Par exemple, définir:

<property name="validating" value="false" /> 
<property name="suppressNamespaces" value="true" /> 
<property name="ignoreExtraElements" value="true" /> 

Un de ceux-ci pourrait le faire.

+0

Quand j'aurai une chance, j'essaierai cela et je vous le ferai savoir. Merci. – Zoidberg

+0

@Zoidberg toujours pas de mise à jour? :) – Bozho

+0

Désolé pour le manque de réponse, notre attention s'est déplacée de ceci à d'autres priorités en ce moment et j'ai été assez occupé. Je vais voter cette réponse, car elle semble la bonne. Une fois que j'ai une chance de l'essayer, je vous ferai savoir si cela fonctionne ou non. Merci encore pour la réponse. – Zoidberg