这是我正在尝试验证xml签名的代码。对于一个包含使用签名算法证书签名的 xml 的 xml 文件md2RSA,它可以正常工作。但是另一个包含使用签名算法证书签名的xml的xml SHA256withRSA,它失败了。这是我试图用来验证签名验证的代码: public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XMLSignatureException, XMLSecurityException { File f = new File("F:\\workspace\\signeddocument2.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setNamespaceAware(true); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); org.w3c.dom.Document doc = dBuilder.parse(f); doc.getDocumentElement().normalize(); Element sigElement = (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS, Constants._TAG_SIGNATURE) .item(0); XMLSignature signature = new XMLSignature(sigElement, f.toURI().toURL().toString()); boolean verified = false; verified = signature.checkSignatureValue(signature.getKeyInfo().getPublicKey()); if (verified) { System.out.println("Signature verified successfully"); } else { System.out.println("Signature verification failed."); } }
2 回答

潇潇雨雨
TA贡献1833条经验 获得超4个赞
似乎您的 xml 中缺少一个标签。
我在这里找到了一些信息:https ://www.w3.org/TR/2009/WD-xmldsig-core2-20091022/
如果您搜索“signname”,您会看到该规范需要一个标签:<C ID="signme" xmlns="&baz;"/>有完整的规范:
<A xmlns:n1="&foo;">
<B xmlns:n2="&bar;">
<Signature xmlns="&dsig;"> ...
<Reference URI="#signme"/> ...
</Signature>
<C ID="signme" xmlns="&baz;"/>
</B>
</A>
您的 XML 没有此标记。可能是原因。

阿晨1998
TA贡献2037条经验 获得超6个赞
我弄清楚了signature
验证失败的原因。XML
与我试图验证的 XML 相比,我正在签名的名称空间不同signature
。这transformation
导致了signature
失败。一旦我弄清楚了转换,signature
验证就起作用了。
添加回答
举报
0/150
提交
取消