9

XMLドキュメントがあります。xmlsignatureを使用してドキュメントの一部に署名しています。ダイジェストを見つける前に、XSLT変換を適用したいと思います。

私が読んだことによると、XSLTはXMLドキュメントを別の形式に変換します(XMLにすることもできます)。今、私は混乱してい
ます。変換された新しいドキュメントはどこで入手できるのでしょうか。

ユーザーに表示したい場合、この新しく作成されたドキュメントから値を取得するにはどうすればよいですか?

私のXMLドキュメント

<r1>
 <user>asd</user>
 <person>ghi</person>
</r1>

変換のためのコード

Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));

xpath変換によると、user要素の値が変更されるたびに、xmlsignatureを検証しないでください。また、person要素の値が変更された場合は、Signatureを検証する必要があります。しかし、person要素の値を変更すると、署名は検証されません。なぜ?

4

3 に答える 3

5

XSLT仕様は、結果ドキュメントに何が起こるかを定義していません。これは、選択したXSLTプロセッサーのAPI仕様によって定義されます。たとえば、JAXPインターフェイスを使用してJavaからXSLTを呼び出す場合、結果をメモリ内のDOMツリーとして要求するか、ディスク上の指定されたファイルにシリアル化するように要求できます。

あなたはあなたの質問に「Java」というタグを付けました。これはあなたがあなたの処理環境に与える唯一の手がかりです。私の推測では、DOMに変換してから、DOMインターフェイスを使用して新しいドキュメントから値を取得したいと考えています。XSLT 2.0とSaxonを使用している場合でも、s9apiインターフェイスはネイティブのJAXPインターフェイスよりもはるかに使いやすくなっています。

于 2012-05-19T08:31:17.680 に答える
5

ドキュメントに署名するときに使用されるxslt変換は、署名の計算時にソースXMLのノードがどのように選択されるかに関連しています。

Daveによるこの質問/回答は、xpath2を使用したXMLドキュメントの一部の署名に関連しています。この回答のSeanMullansの投稿へのリンクは、xpath式の評価がノードごとに行われるため、xpath2がドキュメントの一部に署名するのにより適していることを示唆しています。

したがって、 sun dsigの例に基づいて、次を使用して参照の作成を置き換えることができます。

List<XPathType> xpaths = new ArrayList<XPathType>();
xpaths.add(new XPathType("//r1/user", XPathType.Filter.INTERSECT));

Reference ref = fac.newReference
  ("", fac.newDigestMethod(DigestMethod.SHA1, null),
        Collections.singletonList
          (fac.newTransform(Transform.XPATH2, 
                  new XPathFilter2ParameterSpec(xpaths))),
             null, null); 

これにより、// r1 / userを署名で保護しながら、ドキュメントの残りの部分を変更できます。

xpath / xpath2の選択に関する問題は、/ some / node / that / does / not/existの署名を生成できることです。テストドキュメントを変更し、署名が期待どおりに機能していることを確認するのは正しいことです。

署名を生成し、検証前にxmlノードを改ざんすることにより、テストプログラムでドキュメントをテストできます。

NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");


xpathセレクターのより信頼性の高い代替手段は、次のように署名したいxmlドキュメント要素にIDを配置することです。

<r1>
 <user id="sign1">asd</user>
 <person>ghi</person>
</r1>

次に、このIDをエンベロープ転送の最初のパラメーターのURIとして参照します。

Reference ref = fac.newReference
  ("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
    Collections.singletonList
      (fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
          null, null); 


出力の場合、署名操作により、メモリにロードしたDOMに新しい署名要素が追加されます。次のように変換することで、出力をストリーミングできます。

TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");

trans.transform(new DOMSource(doc), new StreamResult(System.out)); 
于 2012-05-28T11:55:17.123 に答える
3

xslt部分は、変換定義のみを定義し、他には何も定義しません。これを見てください:

javaxsltチュートリアル

Francois Gravelの回答では、input.xmlファイルは変換されるファイルであり、transform.xsltはxmlファイルの変換方法を説明するxslt定義です。output.outは結果であり、これはxmlの場合もありますが、html、フラットファイルの場合もあります。

これは、xsltを使用していたときに始めた場所です。

http://www.w3schools.com/xsl/default.asp

これも見てください:

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

于 2012-05-19T09:24:25.823 に答える