[英]coreValidity is false. Verify XML digital signature
我正在对XML文件进行一些数字签名,我想验证已签名的XML。 我正在使用Java XML Digital Signature API中的代码示例,但是当我去验证刚刚签署的XML上的签名时,
coreValidity为false,而sigValValidity为true
这些之间有什么区别,为什么coreValidity为假? 我可以寻找什么?
谢谢
public void verifySignedXML(KeyPair keypair) throws Exception {
String signedFile = "src/test/resources/file.xml";
// Instantiate the document to be validated
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(
new FileInputStream(signedFile));
// Find Signature element
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,
"Signature");
if (nl.getLength() == 0) {
throw new Exception("Cannot find Signature element");
}
// Create a DOM XMLSignatureFactory that will be used to unmarshal the
// document containing the XMLSignature
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
if (keypair.getPublic() == null) {
log.error("Public key is null");
//TODO throw exception
}
PublicKey key = keypair.getPublic();
// Create a DOMValidateContext and specify a KeyValue KeySelector
// and document context
DOMValidateContext valContext = new DOMValidateContext(
key, nl.item(0));
// unmarshal the XMLSignature
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
// Validate the XMLSignature (generated above)
boolean coreValidity = signature.validate(valContext);
// Check core validation status
if (coreValidity == false) {
System.err.println("Signature failed core validation");
boolean sv = signature.getSignatureValue().validate(valContext);
System.out.println("signature validation status: " + sv);
// check the validation status of each Reference
Iterator<?> i = signature.getSignedInfo().getReferences().iterator();
for (int j = 0; i.hasNext(); j++) {
boolean refValid = ((Reference) i.next()).validate(valContext);
System.out.println("ref[" + j + "] validity status: "
+ refValid);
}
} else {
System.out.println("Signature passed core validation");
}
}
“核心验证”根据XMLDsig标准中定义的规则验证完整签名
核心验证所需的步骤包括(1)参考验证,对SignedInfo中每个参考中包含的摘要的验证,以及(2)对通过SignedInfo计算的签名的加密签名验证。
如果核心验证失败,则至少对Reference
或SignatureValue
执行的验证之一失败。 其余验证方法为您提供详细信息
但是,请小心。 验证XML签名可能会出于许多奇怪的原因而失败,即使使用有效的签名也是如此。 实际上,标准本身对此有所警告
请注意,可能存在某些签名应用程序无法验证的有效签名。 造成这种情况的原因包括未能实现本规范的可选部分,无法或不愿意执行指定的算法,或者不能或不愿意取消引用指定的URI(某些URI方案可能会导致不良的副作用)等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.