繁体   English   中英

coreValidity为假。 验证XML数字签名

[英]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计算的签名的加密签名验证。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM