我有一个XML,其中一个部分使用数字签名进行签名。签名已添加"封装"。现在我需要使用DOM读取xml,更改一些UNSIGNED部分并再次将DOM写入XML(DOM的签名部分和签名保持不变)。 不幸的是,当我在写入xml后验证签名时,它会报告失败的签名。 我比较了两个文件(在更改之前和更改之后)。不同之处在于签名信息的换行。有效文档在签名信息中没有换行符:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2"><XPath xmlns="http://www.w3.org/2002/06/xmldsig-filter2" Filter="intersect">/LicensePool/License</XPath></Transform><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>jLCnv/w4jErO3lQGgHrQSNC5Q2jczGXBfbBHTSemulA=</DigestValue></Reference></SignedInfo><SignatureValue>(...skipped...)</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>(...skipped...)</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature>
,而改变的,无效的一个在任何结束标记之后包裹行。
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
<XPath xmlns="http://www.w3.org/2002/06/xmldsig-filter2" Filter="intersect">/LicensePool/License</XPath>
</Transform>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>jLCnv/w4jErO3lQGgHrQSNC5Q2jczGXBfbBHTSemulA=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>(...skipped...)</SignatureValue>
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus>(...skipped...)</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>
将DOM写入XML的代码不会知道&#34;关于签名及其转换的东西。它只是一个可以读取,编辑和编写XML / DOM的组件。它按如下方式编写DOM:
private void saveXml() throws TransformerException, IOException {
try(OutputStream fos = new BufferedOutputStream(new FileOutputStream(file))){
Source source = new DOMSource(doc);
Result result = new StreamResult(fos);
TransformerFactory transFactory = TransformerFactory.newInstance();
transformer = transFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.transform(source, result);
}
}
为了在写入后验证xml-signature,我使用Java Xml数字签名API。 任何想法出了什么问题?