我正在对XML文件进行一些数字签名,我想验证我签署的XML。我正在使用来自Java XML数字签名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");
}
}
答案 0 :(得分:0)
“核心验证”根据XMLDsig standard
中定义的规则验证完整签名核心验证的必要步骤包括(1)参考验证,SignedInfo中每个参考文献中包含的摘要的验证,以及(2)通过SignedInfo计算的签名的加密签名验证。
如果核心验证失败,则至少在Reference
或SignatureValue
上执行的一项验证失败。其余的验证方法为您提供了详细信息
但是,请小心谨慎。验证XML签名可能由于许多奇怪的原因而失败,即使使用有效签名也是如此。事实上,标准本身警告它
请注意,某些签名应用程序可能无法验证有效签名。造成这种情况的原因包括未能实现此规范的可选部分,无法或不愿意执行指定的算法,或无法或不愿意取消引用指定的URI(某些URI方案可能会导致不良副作用)等。