1

xades署名を生成するためにxades4jを使用しています。参照に xpath 変換を含めたい。私の問題は、それが分離された署名であり、xpath に名前空間があるという事実です...

次のxml(抜粋)で試しました:

<collection xmlns:t="http://test.xades4j/tracks" Id="root">
    <album>
        <title>Questions, unanswered</title>
        <artist>Steve and the flubberblubs</artist>
        <year>1989</year>
        <t:tracks xmlns:t="http://test.xades4j/tracks">
            <t:song length="4:05" tracknumber="1">
                <t:title>What do you know?</t:title>
                <t:artist>Steve and the flubberblubs</t:artist>
                <t:lastplayed>2006-10-17-08:31</t:lastplayed>
            </t:song>
            <t:song length="3:45" tracknumber="2">
                <t:title>Who do you know?</t:title>
                <t:artist>Steve and the flubberblubs</t:artist>
                <t:lastplayed>2006-10-17-08:35</t:lastplayed>
            </t:song>

コードを使用して、このドキュメントのエンベロープ署名を実行しようとすると:

String xpathString = "/collection/album/t:tracks/t:song[ @tracknumber = 1 ]";

DataObjectDesc obj1 = new DataObjectReference("");
obj1.withTransform(new EnvelopedSignatureTransform());
obj1.withTransform(XPath2Filter.intersect( xpathString ));

SignedDataObjects objs = new SignedDataObjects( obj1 );         
Document doc = getDocument(path+fileName);

signer.sign( objs, doc.getDocumentElement() );

それは正常に動作し、参照は次のようになります。

<ds:Reference Id="xmldsig-44c42d30-9a42-4290-afba-b89dc807a668-ref0" URI="">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                    <ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
                        <dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" Filter="intersect">/collection/album/t:tracks/t:song[ @tracknumber = 1 ]</dsig-xpath:XPath>
                    </ds:Transform>
                </ds:Transforms>

しかし、切り離されたバージョンを試してみると、コードは次のようになります。

String xpathString = "/collection/album/t:tracks/t:song[ @tracknumber = 1 ]";

DataObjectDesc obj1 = new DataObjectReference( fileName );
obj1.withTransform(XPath2Filter.intersect( xpathString ));

SignedDataObjects objs = new SignedDataObjects( obj1 );
objs.withBaseUri( "file:///"+path );

signer.sign( objs, db.newDocument());

次のエラーが表示されます: プレフィックスは名前空間に解決する必要があります: t

私の問題は、ここで説明されている名前空間と xpathに似てい ますが、答えはなく、私が持っているものは少し異なります。その問題への答えが私を助けるかもしれないことをゲストに...

では、xades4j で名前空間をトランスフォームに設定するにはどうすればよいですか?

4

1 に答える 1

0

ナイスキャッチ!現在、これを指定する方法はありません。ただし、基盤となる Apache Santuario API はsetXPathNamespaceContextメソッドを使用してこれをサポートしていると思います。XPath出力要素に名前空間宣言が含まれるように見えます。これをテストし、可能であればサポートを追加します。

于 2014-09-11T21:18:57.333 に答える