首页 > 解决方案 > Xades4j 对带有附件的 xml 文件进行签名

问题描述

是否可以使用没有 baseURI 的附件签署 xml 文档?

代码:

        SignedDataObjects signedDataObjects = new SignedDataObjects();
        DataObjectReference dataObjectReference = new DataObjectReference("");
        dataObjectReference.withTransform(new DataObjectTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature"));
        signedDataObjects.withSignedDataObject(dataObjectReference);
        signedDataObjects.withBaseUri(baseUri + File.separator);

        attachments.forEach(attachment -> {
            DataObjectDesc dataObjectReferenceForAttachment = new DataObjectReference(attachment.getName());
            signedDataObjects.withSignedDataObject(dataObjectReferenceForAttachment);
        });

        XadesSigner signer = profile.newSigner();
        signer.sign(signedDataObjects, xmlDocument.getDocumentElement());

我想跳过这行:

signedDataObjects.withBaseUri(baseUri + File.separator);

可以用byte[]的形式发送附件吗?可以有很多这样的附件。不幸的是,我无法将文件保存到磁盘。

标签: javaxades4j

解决方案


要问的一个重要问题是:如何验证此签名?如果验证时某些自定义资源解析具有灵活性,我建议使用自定义 URI 方案和自定义资源解析器。

// Only once
signedDataObjects.withResourceResolver(new AttachmentsResolver(attachments));
// In the loop
DataObjectDesc dataObjectReferenceForAttachment = new DataObjectReference("attachment:" + attachment.getName());

自定义解析器检查 URI 是否是,并从集合中attachment:获取给定名称的内容。attachments

示例:https ://github.com/luisgoncalves/xades4j/blob/master/src/test/java/xades4j/production/SignedDataObjectsProcessorTest.java

参考:http://luisgoncalves.github.io/xades4j/javadocs/1.6.0/reference/xades4j/production/SignedDataObjects.html#withResourceResolver(org.apache.xml.security.utils.resolver.ResourceResolverSpi)

如果验证端没有处理自定义 URI 的逻辑,那么我建议使用EnvelopedXmlObject.

旁注:

  • 有一个EnvelopedSignatureTransform类可以使用。

  • 这些withNNN方法可以让你流利地写东西。

    new DataObjectReference("").withTransform(new EnvelopedSignatureTransform());
    

推荐阅读