Hello, after further investigation i found out that the signature itself is valid but the reference validation fails.
The signatures are created using JRE5 xmldsig and the SUN xmlsec APIs. This is the actual code: public void signDocumentXPath(Document document, PrivateKey privKey, String baseXPath) throws Exception { // Create a DOM XMLSignatureFactory that will be used to generate the // enveloped signature String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI"); XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance()); // Create a Reference to the enveloped document (in this case we are // signing the whole document, so a URI of "" signifies that) and // also specify the SHA1 digest algorithm and the ENVELOPED Transform. Vector v = new Vector(); XPathType type = new XPathType(baseXPath, XPathType.Filter.UNION); v.add(type); XPathFilter2ParameterSpec spec = new XPathFilter2ParameterSpec(v); Reference ref = fac.newReference( "", fac.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList( fac.newTransform( Transform.XPATH2, (TransformParameterSpec) spec)), null, null); // Create the SignedInfo SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod( CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (C14NMethodParameterSpec) null), fac.newSignatureMethod( SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref)); // Create a KeyValue containing the RSA PublicKey that was generated KeyInfoFactory kif = fac.getKeyInfoFactory(); //KeyValue kv = kif.newKeyValue(kp.getPublic()); KeyName kn = kif.newKeyName("My Keyname"); // Create a KeyInfo and add the KeyValue to it KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kn)); // Create a DOMSignContext and specify the DSA PrivateKey and // location of the resulting XMLSignature's parent element DOMSignContext dsc = new DOMSignContext(privKey, document.getDocumentElement()); // Create the XMLSignature (but don't sign it yet) XMLSignature signature = fac.newXMLSignature(si, ki); // Marshal, generate (and sign) the enveloped signature signature.sign(dsc); } (this is my xml doc created by the SUN XML API) <?xml version="1.0" encoding="UTF-8"?><tbone> <license> <param name="myparam">Test</param> </license> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2"><XPath xmlns="http://www.w3.org/2002/06/xmldsig-filter2" Filter="union">/tbone/license</XPath></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>cp68+Em7EAO6X62j+kw7a8T08qU=</DigestValue></Reference></SignedInfo><SignatureValue>TH3tGkUs0Pnzgzb74OjVjqkrZA/9LqBaC4ZzrPrFevsdPBl94XFKg3hPdofLBdFkvb+vkYb9T9TT 0436m+aQOnC6Y9pwk7lCKYPvbPeZcwCwUCFa7ccGh0jGSyp83QgBI6eqomWkaI8xq56WjgcvXKiv JvZ4sh7QsdQp3dw2q84=</SignatureValue><KeyInfo><KeyName>My Keyname</KeyName></KeyInfo></Signature></tbone> When i verify the created signature with Apache XML and enabled debugging i get the following log outputs: 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.DOMSignatureMethod verify FEIN: Signature provider:SunRsaSign version 1.5 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.DOMSignatureMethod verify FEIN: verifying with key: Sun RSA public key, 1024 bits modulus: 90423977268013193772672493202847721746573381377536653055997475685558693423657635618679640933512827048211696104270215394685726992656662856050800019998736714201782694955154594507516110929849902421860824852636310291332896187286679644658867737292920964731844144276040900126543154791203642895978715491940484467691 public exponent: 65537 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer transform FEIN: Created transform for algorithm: http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer transform FEIN: isNodeSet() = true 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.DOMSignedInfo canonicalize FEIN: Canonicalized SignedInfo: <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2"><XPath xmlns="http://www.w3.org/2002/06/xmldsig-filter2" Filter="union">/tbone/license</XPath></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>cp68+Em7EAO6X62j+kw7a8T08qU=</DigestValue></Reference></SignedInfo> 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.DOMSignedInfo canonicalize FEIN: Data to be signed/verified:PFNpZ25lZEluZm8geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxD YW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAw MS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIj48L0Nhbm9uaWNhbGl6YXRpb25N ZXRob2Q+PFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv MDkveG1sZHNpZyNyc2Etc2hhMSI+PC9TaWduYXR1cmVNZXRob2Q+PFJlZmVyZW5jZSBVUkk9IiI+ PFRyYW5zZm9ybXM+PFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDIv MDYveG1sZHNpZy1maWx0ZXIyIj48WFBhdGggeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDIv MDYveG1sZHNpZy1maWx0ZXIyIiBGaWx0ZXI9InVuaW9uIj4vdGJvbmUvbGljZW5zZTwvWFBhdGg+ PC9UcmFuc2Zvcm0+PC9UcmFuc2Zvcm1zPjxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8v d3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSI+PC9EaWdlc3RNZXRob2Q+PERpZ2VzdFZh bHVlPmNwNjgrRW03RUFPNlg2Mmora3c3YThUMDhxVT08L0RpZ2VzdFZhbHVlPjwvUmVmZXJlbmNl PjwvU2lnbmVkSW5mbz4= 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.DOMReference dereference FEIN: URIDereferencer class name: org.jcp.xml.dsig.internal.dom.DOMURIDereferencer 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.DOMReference dereference FEIN: Data class name: org.jcp.xml.dsig.internal.dom.ApacheNodeSetData 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.ApacheTransform transformIt FEIN: Created transform for algorithm: http://www.w3.org/2002/06/xmldsig-filter2 28.01.2009 12:50:20 org.jcp.xml.dsig.internal.dom.ApacheTransform transformIt FEIN: ApacheData = true 0 [main] INFO org.apache.xml.security.utils.CachedXPathFuncHereAPI - Registering Here function 28.01.2009 12:50:21 org.jcp.xml.dsig.internal.DigesterOutputStream write FEINER: Pre-digested input: 28.01.2009 12:50:21 org.jcp.xml.dsig.internal.DigesterOutputStream write FEINER: <tbone> <license> <param name="myparam">Test</param> </license> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2"><XPath xmlns="http://www.w3.org/2002/06/xmldsig-filter2" Filter="union">/tbone/license</XPath></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>cp68+Em7EAO6X62j+kw7a8T08qU=</DigestValue></Reference></SignedInfo><SignatureValue>TH3tGkUs0Pnzgzb74OjVjqkrZA/9LqBaC4ZzrPrFevsdPBl94XFKg3hPdofLBdFkvb+vkYb9T9TT 0436m+aQOnC6Y9pwk7lCKYPvbPeZcwCwUCFa7ccGh0jGSyp83QgBI6eqomWkaI8xq56WjgcvXKiv JvZ4sh7QsdQp3dw2q84=</SignatureValue><KeyInfo><KeyName>My Keyname</KeyName></KeyInfo></Signature></tbone> 28.01.2009 12:50:21 org.jcp.xml.dsig.internal.dom.DOMReference validate FEIN: Expected digest: cp68+Em7EAO6X62j+kw7a8T08qU= 28.01.2009 12:50:21 org.jcp.xml.dsig.internal.dom.DOMReference validate FEIN: Actual digest: P1nwaETN2vl9o4U4FSRVdb6U0Sc= 28.01.2009 12:50:21 org.jcp.xml.dsig.internal.dom.DOMXMLSignature validate FEIN: Reference[] is valid: false 28.01.2009 12:50:21 org.jcp.xml.dsig.internal.dom.DOMXMLSignature validate FEIN: Couldn't validate the References This forum post hinted at a possible namespace problem http://forums.java.net/jive/message.jspa?messageID=37326 but im not sure - because i dont see the suggested 2 pre-digests output. --- On Tue, 1/27/09, Sean Mullan <sean.mul...@sun.com> wrote: > From: Sean Mullan <sean.mul...@sun.com> > Subject: Re: Invalid Signature problem through Empty elements are converted > to start-end tag pairs > To: security-dev@xml.apache.org > Date: Tuesday, January 27, 2009, 2:49 PM > Harakiri wrote: > > We created signatures using the SUN XML Signature APIs > in JRE 5 Versions. > > Hmm, which APIs are those? What software are you using? > Have you tried JRE 6 to see if the problem still exists? > > > Due to a bug in SUNs API we like to use the XML > Security API from Apache. > > > > However, all our signatures are invalid through > possibly a bug in java. > > > > The signatures have been created with the following: > > > > http://www.w3.org/TR/2001/REC-xml-c14n-20010315 > > > > however it seems that java signed empty tags as: > > > > <param name="myparam"/> > > > > but apache security correctly validates as > > > > <param name="myparam"></param> > > > > Since i cant just change existing signatures, how can > I modify the apache xmldsig validation so that it will not > compute the hash over the empty tags as > <param></param> but as <param/> ? > > You can't, as Scott notes. Well, you could hack up the > code yourself and build your own library but then you would > just be bug-compatible. The existing signatures would still > not interoperate with other vendors. > > Sorry, but I think your only solution may be to regenerate > the signatures. > > --Sean