Frage

Das ist mein XML-Dokument.Ich möchte nur den Benutzer-ID-Teil mit einer XML-Signatur signieren.Ich verwende die XPath-Transformation, um dieses bestimmte Element auszuwählen.

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos
t:8080/consumer.jsp">
<UserID>
   xyz
</UserID>
<testing>
   text
</testing>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
   http://localhost:8080/saml/SProvider.jsp
</saml:Issuer>
</samlp:AuthnRequest>


Ich verwende den folgenden Code, um die Transformationen hinzuzufügen:

transformList.add(exc14nTransform);
 transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));


Aber ich bekomme folgendes:

Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'


Also habe ich versucht, den xmlns-Teil zu entfernen.

transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));


Aber es signiert das gesamte Dokument und gibt die folgende Meldung aus:

com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function


Was ist das Problem?
BEARBEITEN
Wie @Jörn Horstmann sagte, ist die Nachricht nur ein Protokoll oder so etwas in der Art.Das Problem besteht nun darin, dass selbst nach der XPath-Abfrage das gesamte Dokument signiert wird und nicht nur die Benutzer-ID.Ich habe dies bestätigt, indem ich den Wert von geändert habe <testing>Element nach der Unterzeichnung des Dokuments.Das Ergebnis ist, dass das Dokument nicht validiert wird (Wenn nur der UserID-Teil signiert wurde, werden alle daran vorgenommenen Änderungen berücksichtigt <testing> sollte zu einer gültigen Signatur führen.)

War es hilfreich?

Lösung

Dies ist kein gültiger XPath-Ausdruck. Es gibt keine Möglichkeit, ein Namespace-Präfix innerhalb des Ausdrucks zu deklarieren.

samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

XPathFilterParameterSpec verfügt über einen anderen Konstruktor, der die Angabe einer Zuordnung von Namespace-Präfixen ermöglicht. Sie können den folgenden Ausdruck ausprobieren:

new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
    Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))

Bearbeiten:

Die Meldung scheint kein Fehler zu sein Zeile 426 hier, seine Protokollebene sollte jedoch wahrscheinlich niedriger als INFO sein.

Ich habe mir auch das angeschaut Beschreibung der XPath-Filterung:

Der im XPath-Parameter angezeigte XPath-Ausdruck wird einmal für jeden Knoten im Eingabeknotensatz ausgewertet.Das Ergebnis wird in einen booleschen Wert umgewandelt.Wenn der boolesche Wert wahr ist, ist der Knoten im Ausgabeknotensatz enthalten.Wenn der boolesche Wert falsch ist, wird der Knoten aus der Ausgabeknotenmenge weggelassen.

Der korrekte XPath-Ausdruck sollte also nur enthalten UserID in der Signatur wäre self::UserID.Aber fragen Sie mich nicht, ob das für eine XML-Signatur tatsächlich Sinn macht.Das Beispiel in der Spezifikation scheint einen xpath-Ausdruck zu verwenden, um alles außer dem Signaturelement selbst einzuschließen:

not(ancestor-or-self::dsig:Signature)

Bearbeiten 2:

Der richtige Ausdruck ist eigentlich ancestor-or-self::UserID da der Filter auch die Text-Kindknoten des enthalten muss UserID Knoten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top