【问题标题】:How to verify for counter signed XML document?如何验证会签的 XML 文档?
【发布时间】:2013-12-10 08:52:29
【问题描述】:

如何验证使用库Xades4j 用于会签的 xml 文档。 使用Xades4j 验证时出现以下错误:

xades4j.verification.CounterSignatureSigValueRefException: 属性“CounterSignature”的验证失败:计数器 签名不引用 SignatureValue 元素 会签签名在 xades4j.verification.CounterSignatureVerifier.verify(CounterSignatureVerifier.java:75) 在 xades4j.verification.CounterSignatureVerifier.verify(CounterSignatureVerifier.java:37) 在 xades4j.verification.GenericDOMDataVerifier.verify(GenericDOMDataVerifier.java:65) 在 xades4j.verification.GenericDOMDataVerifier.verify(GenericDOMDataVerifier.java:30) 在 xades4j.verification.QualifyingPropertiesVerifierImpl.verifyProperties(QualifyingPropertiesVerifierImpl.java:59) 在 xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:187) 在 com.fit.einvoice.ingcountersigner.service.xades.XadesVerifyOperation.verifySignature(XadesVerifyOperation.java:92) 在 com.fit.einvoice.ingcountersigner.service.xades.XadesVerifyOperation.verifySignature(XadesVerifyOperation.java:87) 在 com.fit.einvoice.ingcountersigner.service.xades.XadesVerifyOperation.verifySignature(XadesVerifyOperation.java:64)

我的验证功能:

static void checkSigned(File file) {
     InputStream inputStream = null;
     try {
         inputStream = new FileInputStream(file);
         XadesVerifyOperation verifyOperation = new XadesVerifyOperation();
         ArrayList<XadesVerificationResults> results = verifyOperation.verifySignature(inputStream);
            System.out.println("results size: " + results.size());
            for (XadesVerificationResults result : results) {
                System.out.println(result.SigningCertificate.getIssuerDN());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException ex) {
            }
      }
 }

编辑:

我的会签功能:

public void CounterSign() throws TransformerFactoryConfigurationError, Exception {
        Document doc = SignatureServicesBase.getDocument(_inputStream);
        Element sigElem = (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS, Constants._TAG_SIGNATURE).item(0);

        System.out.println(sigElem.getNodeName());

        org.apache.xml.security.Init.init();
        XMLSignature xmlSig = new XMLSignature(sigElem, doc.getBaseURI());

         //Create counter signer
        XadesBesSigningProfile signingProfile = new XadesBesSigningProfile(new Pkcs11KeyingDataProvider(_certInfo));
        signingProfile.withAlgorithmsProvider(Sha1AlgProvider.class);
        signingProfile.withBasicSignatureOptionsProvider(new MyBasicSignatureOptionsProvider(true, true, false));
        final XadesSigner counterSigner = signingProfile.newSigner();

        //Extend with counter signature
        XadesFormatExtenderProfile extenderProfile = new XadesFormatExtenderProfile();
        XadesSignatureFormatExtender extender = extenderProfile.getFormatExtender();
        List unsignedProps = Arrays.asList(new CounterSignatureProperty(counterSigner));
        extender.enrichSignature(xmlSig, new UnsignedProperties(unsignedProps));

        SignatureServicesBase.outputDocument(doc, _outStream);

        if (!_isStream) {
            _inputStream.close();
            _outStream.close();
        }
    }

【问题讨论】:

    标签: xml-signature xades4j


    【解决方案1】:

    我不确定我是否完全理解您的问题。如果您询问如何验证反签名属性,它已经作为“主”签名验证的一部分完成。请注意:

    • 主签名和副签名都使用相同的XadesVerifier
    • 如果验证成功,则会将CounterSignatureProperty 类型的属性添加到结果中。
    • 您可以访问主签名的属性through the verification result

      XAdESVerificationResult res = ...;
      CounterSignatureProperty p =  res.getPropertiesFilter().getOfType(CounterSignatureProperty.class);
      

    编辑:

    消息说明一切:计数器签名可能无效。根据定义,反签名必须包含对反签名 SignatureValue 元素的引用。

    您能否在原始 XML 文档中查找 CounterSignature 元素并将其发布到此处?

    【讨论】:

    • 感谢您的回答。会签的 xml 文件:dropbox.com/s/xwsmstp809y33de/countersigned.xml 第一个签名的原始文件:dropbox.com/s/xiy99o06d3m8lqy/signed.xml
    • 您是否更改了有关如何将数据对象引用添加到签名的 lib 代码?对主签名的 SignatureValue 元素的计数器签名引用有一个“xml-c14n11#WithComments”转换。默认情况下不应添加。无论如何,我认为异常的原因是,目前,计数器签名的验证假定取消引用 SignatureValue ref 会在 XML 节点上产生。随着规范化,这是不正确的。我需要检查它是否是完全相同的节点,这意味着允许转换是不安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多