質問

これは私の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"
.

xpathfilterparameterspec ネームスペースプレフィックスのマッピングを指定できる別のコンストラクタは、次の式を試すことができます。

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です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top