Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 504
vaxxxik Avatar asked Feb 16 '26 07:02

vaxxxik


1 Answers

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.

like image 139
Sreeram Nair Avatar answered Feb 18 '26 20:02

Sreeram Nair



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!