Java-XML数字签名及其更多参考

Java-XML数字签名及其更多参考,java,xml,reference,digital-signature,Java,Xml,Reference,Digital Signature,我正在尝试使用Java创建XML数字签名。 我的代码如下所示: XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); // create Reference to Object element Reference objectRef = fac.newReference( "#Res", fac.newDigestMethod(DigestMethod.SHA256, null) ); // creat

我正在尝试使用Java创建XML数字签名。 我的代码如下所示:

XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
// create Reference to Object element
Reference objectRef = fac.newReference(
    "#Res",
    fac.newDigestMethod(DigestMethod.SHA256, null)
);
// create Reference to KeyInfo element
Reference keyInfoRef = fac.newReference(
    "#KeyInfo",
    fac.newDigestMethod(DigestMethod.SHA256, null)
);
我的问题是,我需要创建带有两个引用的XML数字签名—对Res对象的引用和对KeyInfo的引用。在创建了两个引用元素并调用了符号方法之后,Java给出了以下错误:

Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID KeyInfo
at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:431)
at org.jcp.xml.dsig.internal.dom.DOMReference.digest(DOMReference.java:359)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(DOMXMLSignature.java:496)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:379)
at XmlDigitalSignatureGenerator.generateXmlDigitalSignature(XmlDigitalSignatureGenerator.java:108)
at Main.main(Main.java:25)

谢谢。

使用验证模式将元素注册为ID引用,我可以解决这个问题

XMLStructure content = new DOMStructure(doc.getDocumentElement());
XMLObject obj = fac.newXMLObject(Collections.singletonList(content), "KeyInfo", null, null);

现在“keyInfo”已注册,因此将允许签名。

您的代码非常简单<代码>密钥信息仅在签名生成期间创建。可能是API不允许直接对
KeyInfo
进行签名。如果使用此
KeyInfo
来选择要验证的密钥,则对其进行签名不会提供太多额外的安全性。一般来说,验证密钥已经签名,是证书的一部分,因此这种功能没有太大用处。