我需要通过 REST 发送签名的 XML 消息。 XSD 包含架构 https://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd。我能够成功生成带有签名的 XML 文档并将其写入文件。
我的问题是 XML 签名库 (javax.xml.crypto.dsig) 生成签名作为接口“XMLSignature”。但是从我的 XSD 生成的 DTO 使用 xmldsig-core-schema.xsd 中的 Java 类。
有没有办法让 XML 签名库使用从 XSD 生成的 Java 文件或简单地转换 XMLSignature?
这是从 XSD 生成的类:
我能够通过创建自定义解组器来实现此要求。
这是签名代码,我在其中从包 javax.xml.crypto.dsig 创建一个新的 XMLSignature 对象。用它来签署文件。
最后,使用自定义解组器将文档读取为 DTO,并最终获得要分配给 JAXB 生成的 DTO 的签名对象。
XMLSignature signature = signatureFactory.newXMLSignature(signedInfo, ki);
// Marshal, generate, and sign the enveloped signature
signature.sign(dsc);
JAXBElement<?> root = XmlUtils.UNMARSHALLER.unmarshal(getStreamSource(doc), xml.getClass());
xml.setSignature(((Xml) root.getValue()).getSignature());
更详细的解释可以在我的博客中找到:https://www.czetsuyatech.com/2023/02/java-implementation-of-digital-signature-and-x509certificate.html