java - 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[]的形式发送附件吗?可以有很多这样的附件。不幸的是,我无法将文件保存到磁盘。
解决方案
要问的一个重要问题是:如何验证此签名?如果验证时某些自定义资源解析具有灵活性,我建议使用自定义 URI 方案和自定义资源解析器。
// Only once
signedDataObjects.withResourceResolver(new AttachmentsResolver(attachments));
// In the loop
DataObjectDesc dataObjectReferenceForAttachment = new DataObjectReference("attachment:" + attachment.getName());
自定义解析器检查 URI 是否是,并从集合中attachment:
获取给定名称的内容。attachments
如果验证端没有处理自定义 URI 的逻辑,那么我建议使用EnvelopedXmlObject
.
旁注:
有一个
EnvelopedSignatureTransform
类可以使用。这些
withNNN
方法可以让你流利地写东西。new DataObjectReference("").withTransform(new EnvelopedSignatureTransform());
推荐阅读
- python - 什么~
做? - visual-studio-code - 即使在安装 ESlint 后,箭头功能也无法在 VS 代码中起作用
- mdriven - 使用 ModelDrivenControllerBase 调用 MDrivenEcoSpaceAndModelForNetStandard 时出现 ESType 错误
- blockchain - 如何调试 Chainlink 作业任务?
- javascript - 如何使用javascript旋转移动相机?
- spring - 为什么我应该在 STOMP send() 方法中使用 JSON.stringify() ?
- javascript - POST 请求生成失败获取
- docker - Phoenix Liveview - 容器外的资产
- reactjs - React:如何引导新页面
- python - 如何使用熊猫将 xlxs 文件中的内容转换为 python 中的列表列表?