2009-12-11 14 views
10

350 Bounty und Waffeln an die Person, die mir helfen können!Entschlüsseln Nachricht mit einem Spring Web Service Client

Ich habe mit Spring Web-Service-Verschlüsselung seit Tagen gekämpft und ich kann nicht herausfinden, wie man Spring-Verschlüsselung auf den Nachrichtentext zu arbeiten. Immer wenn ich den Server die resultierende Nachricht verschlüsseln lasse, scheint der Client diese nicht zu entschlüsseln, bevor er versucht, sie gegen das Schema zu validieren (XSD).

Here is the server side configuration

The server's xwss security configuration

The client's Spring configuration

Client's xwss configuration

Was kann ich tun, ist, den Benutzer-Token verschlüsselt und es erfolgreich entschlüsseln. Ich tue das, wenn ich Daten vom Client zum Server sende. Der Server entschlüsselt dann das Benutzertoken und authentifiziert die Benutzeranmeldeinformationen, was sehr gut funktioniert.

Das Problem tritt auf, wenn ich versuche, den Körper der Nachricht zurück zu verschlüsseln. Das Problem tritt auf der Clientseite auf. Es scheint, dass der Client versucht, die Nachricht zu validieren, bevor sie entschlüsselt wird, und daher tritt ein Fehler bei der Validierung gegen das Schema auf.

[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.

Und hier ist die Rangierung Zuordnungsdatei

<?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> 

Ich weiß, dass es eine Menge Informationen, aber ich dachte, ich alles bieten würde. Ist meine Verschlüsselungskonfiguration korrekt? Ist es nicht möglich, den Nachrichtentext zu verschlüsseln und auf der Clientseite zu entschlüsseln? An dieser Stelle bin ich offen für fast jeden Vorschlag.

+0

haben Sie noch nicht die ganze Info gegeben;) Geben Sie den vollständigen StackTrace (oder schneiden Sie es zumindest an einem sinnvollen Ort, nicht am Anfang) – Bozho

+0

Das ist alles, was ich für einen Fehler bekomme. Ich bekomme keine ganze Stack-Spur. Der Stack-Trace, den ich erhalte, versucht, die Nachricht gegen die XSD zu validieren, was bei verschlüsselten Daten nicht funktioniert. – Zoidberg

+0

Es klingt, als ob der DecryptionProcessor das Schema dessen, was entschlüsselt wird, kennen möchte, aber nicht. In der Spring-XML Ihres Clients sehe ich nicht, dass die "Schema" -Referenzen irgendwo verwendet werden ... –

Antwort

0

Sind Sie sicher,

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

richtig aufgelöst wird?

Der Fehler, den Sie bekommen, zeigt an, dass es nicht finden kann, wie man mit diesem Element umgeht. Sie würden den Elementnamen und das Präfix nicht sehen, wenn die Antwort nicht entschlüsselt wurde.

Können Sie den Webdienst ohne Verschlüsselung validieren und ausführen?

+0

Ja, ich kann es ohne Verschlüsselung erfolgreich ausführen. Es kennt ns0: HolidayListResponse, weil das Schema verlangt, dass es das Element der obersten Ebene in der Antwort ist, aber die Nachricht ist verschlüsselt, so dass es dieses Top-Level-Element nicht sieht. Was die xsd-Eigenschaft angeht, ja, es löst richtig auf, Spring-Start-Pfade direkt vom Klassenpfad. Ich habe versucht, den Pfad zu ändern, und ich bekomme einen Fehler beim Start, wenn es die XSD-Datei nicht finden kann. – Zoidberg

2

Werfen Sie einen Blick auf CastorMarshaller Eigenschaften, und versuchen Sie, einige der "ignorierenden" zu wahren (in Ihrem <bean id="castorMarshaller"). Zum Beispiel:

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

Einer von denen könnte es tun.

+0

Wenn ich eine Chance bekomme, werde ich das versuchen und Sie wissen lassen. Vielen Dank. – Zoidberg

+0

@Zoidberg noch kein Update? :) – Bozho

+0

Entschuldigung für die mangelnde Resonanz, unser Schwerpunkt hat sich jetzt auf andere Prioritäten verlagert und ich war ziemlich beschäftigt. Ich werde diese Antwort abstimmen, weil sie wie die richtige aussieht. Sobald ich eine Chance habe, es zu versuchen, werde ich Sie wissen lassen, ob es funktioniert oder nicht. Nochmals vielen Dank für die Antwort. – Zoidberg

Verwandte Themen