XPath変換はJavaで動作していません
-
12-12-2019 - |
質問
これは私のXML文書です。 XML署名を使用しているユーザーID部品だけに署名したいです。 XPath変換を使用してその特定の要素を選択しています。
<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>
.
次のコードを使用して変換を追加しています:
transformList.add(exc14nTransform);
transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));
.
しかし、私は次の手順を受けます:
Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'
.
だから、私はXMLNS部分を削除しました。
transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));
.
しかし、それは文書全体に署名し、次のメッセージを与えます:
com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function
.
問題は何ですか?
edit
@jörnHorstmannがメッセージがただのログかそのようなものであると言ったように。問題は、XPathクエリに文書全体が承認された後でも、ユーザーIDだけでは署名されたことです。これを確認しました。これは、文書に署名した後に<testing>
Elementの値を変更します。その結果、ドキュメントが検証されないことです(ユーザーID部分のみに署名されている場合は、<testing>
に加えられた変更は有効な署名になるはずです。)
解決
これは有効なXPath式ではありません。式の内部にネームスペースのプレフィックスを宣言する方法はありません。
samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
.
new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))
.
編集:
メッセージはエラーなしそうではないが、行426ここ、そのログレベルはおそらく情報よりも低いはずです。
私はまた、 XPathフィルタリングの説明 :
XPathパラメータに表示されるXPath式は、入力ノードセット内の各ノードに対して1回評価されます。結果はブール値に変換されます。ブール値がTRUEの場合、ノードは出力ノードセットに含まれます。ブール値が偽の場合、ノードは出力ノードセットから省略されます。
そのため、署名内のUserID
を含めるための正しいXPath式はself::UserID
になります。しかし、これが実際にXML署名のために理にかなっているかどうか私に聞かないでください。仕様の例では、XPath式を使用して署名要素自体を除くすべてを含めるようです。
not(ancestor-or-self::dsig:Signature)
.
編集2:
フィルタはancestor-or-self::UserID
ノードのテキスト子ノードを含める必要があるため、正しい式は実際にはUserID
です。