XSLT変換XMLSignature Javaでは?
-
11-12-2019 - |
質問
XML文書を持っています。XMLSignatureを使用して文書の一部に署名しています。ダイジェストを見つける前に、私はXSLT変換を適用したいのです。Strong>今、私は混乱しています、
変換された新しい文書は利用可能になりますか? この新しく作成された文書からの値を取得する方法ユーザーに表示するには?
マイXML文書
.
<r1>
<user>asd</user>
<person>ghi</person>
</r1>
変換のコード
.
Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));
XPath変換に従って、user要素の値が変更されるたびにXMLSignatureを検証しないでください。また、Person要素の値が変更された場合は、署名を検証する必要があります。しかし、私が個人要素の値を変更したとき、署名は検証されません。なぜ?
解決
文書に署名するときに使用されるXSLT変換は、署名が計算されたときにソースXMLのノードがどのように選択されるかに関する。
この質問/回答 dave XPath2を使用してXML文書の署名に関連しています。 リンクこの答えでは、Sean MullansのPOST へのXPath2は、XPath 2がノードごとに行われているために文書の部分の署名に適しています。
> 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の選択に関する問題は、 / onew / node / do / envent に対して署名を生成できることです。テスト文書を変更し、署名が予想される方法で機能していることを確認してください。
検証前に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>
.
は、包み込まれた転送の最初のパラメータのURIとしてこのIDを参照します:
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));
. 他のヒント
XSLT仕様は結果文書に何が起こるのかを定義していません。これは、選択したXSLTプロセッサのAPI仕様によって定義されます。たとえば、JAXPインタフェースを使用してJavaからXSLTを呼び出すと、結果をMEMORYのDOMツリーとして、またはディスク上の指定されたファイルにシリアル化されるようにすることができます。
あなたの質問 "Java"があなたの処理環境に与える唯一の手がかりである。私の推測は、DOMに変換してからDOMインターフェイスを使用して新しいドキュメントから値を取得します。XSLT 2.0とSAXONを使用している場合、S9APIインターフェイスはネイティブJAXPインタフェースよりもはるかに使用できません。
XSLT部品は変換定義のみを定義しています。 これを見てください:
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&amp; xsltfile= cdcatalog