vaxxxik
vaxxxik

Reputation: 41

Java - XML digital signature with more references

I am trying to create XML digital signature using Java. My code looks like:

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)
);

My problem is, that I need to create XML digital signature with two references - reference to Res object and to KeyInfo. After creating two reference elements and called method for sign, Java gives me this error:

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)

Thanks.

Upvotes: 3

Views: 1432

Answers (1)

Sreeram Nair
Sreeram Nair

Reputation: 2397

Using a validating schema which will register the elements with ID references i could solve this issue

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

Now the "keyInfo" is registered and hence will allow the signature.

Upvotes: 1

Related Questions