0

これは私の xml ドキュメントです。xml署名を使用してuserID部分のみに署名したい。その特定の要素を選択するために 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


何が問題ですか?
編集
@JörnHorstmannが言ったように、メッセージは単なるログまたはそのようなものです。問題は、xpath クエリを実行した後でも、UserID だけでなくドキュメント全体が署名されていることです。<testing>ドキュメントに署名した後、要素の値を変更することでこれを確認しました。その結果、ドキュメントは検証されません (UserID 部分のみに署名した場合、変更を加えると<testing>有効な署名が得られます)。

4

1 に答える 1

3

これは有効な 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 行を参照してください。ただし、そのログ レベルはおそらく INFO よりも低いはずです。

xpath フィルタリングの説明も見ました。

XPath パラメーターに表示される XPath 式は、入力ノード セット内のノードごとに 1 回評価されます。結果はブール値に変換されます。ブール値が true の場合、ノードは出力ノード セットに含まれます。ブール値が false の場合、ノードは出力ノード セットから省略されます。

したがって、UserID署名にのみを含める正しい xpath 式は になりますself::UserID。しかし、これが xml 署名にとって実際に意味があるかどうかは聞かないでください。仕様の例では、署名要素自体を除くすべてを含めるために xpath 式を使用しているようです。

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

編集2:

ancestor-or-self::UserIDフィルターにはノードのテキスト子ノードも含める必要があるため、実際には正しい式ですUserID

于 2012-05-22T11:11:29.067 に答える