coreValidity为false。验证XML数字签名

时间:2017-02-07 12:15:30

标签: java xml digital-signature

我正在对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");
        }
    }

1 个答案:

答案 0 :(得分:0)

“核心验证”根据XMLDsig standard

中定义的规则验证完整签名
  

核心验证的必要步骤包括(1)参考验证,SignedInfo中每个参考文献中包含的摘要的验证,以及(2)通过SignedInfo计算的签名的加密签名验证。

如果核心验证失败,则至少在ReferenceSignatureValue上执行的一项验证失败。其余的验证方法为您提供了详细信息

但是,请小心谨慎。验证XML签名可能由于许多奇怪的原因而失败,即使使用有效签名也是如此。事实上,标准本身警告它

  

请注意,某些签名应用程序可能无法验证有效签名。造成这种情况的原因包括未能实现此规范的可选部分,无法或不愿意执行指定的算法,或无法或不愿意取消引用指定的URI(某些URI方案可能会导致不良副作用)等。