Markus I'm not a JDOM expert, well I have never use it. But It seems to me that the JDOM is not creating a DOM tree namespace-aware. To see what it means instead of DOMOutputter outputter = new DOMOutputter(); return outputter.output(jdomDoc);
Just write to a ByteArray or a String, a parse it again with DocumentBuilder.parse with the DocumentBuilder namespace aware. Regards, Raul On 9/4/06, Markus Werner <[EMAIL PROTECTED]> wrote:
Hi Raul, the client side uses Apache XML Security for Java 1.3.0 [1]. The XML-Document is created using JDOM first and then it is translated into a org.w3c.Document using the following function: public org.w3c.dom.Document convertToDOM(Document jdomDoc) throws JDOMException { DOMOutputter outputter = new DOMOutputter(); return outputter.output(jdomDoc); } The resulting DOM-Document will then be signed, which leads in a resulting output as shown below. It is not possible to create the DOM-document directly in my implementation, i.e. the workaround using JDOM first is necessary. I extended the convertion function as follows: public static Document convertToJDOM(org.w3c.dom.Document domDoc) throws JDOMException, ParserConfigurationException { javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); org.w3c.dom.Document doc = db.newDocument(); // input missing link here DOMBuilder builder = new DOMBuilder(); return builder.build(domDoc); } But I wasn't able to fill the missing link between the DocumentBuilder and the final org.w3c.Document. Would anyone please be so kind and help me with that? Thank you in advance, Markus. -- [1] http://xml.apache.org/security/dist/java-library/ Raul Benito schrieb: > Hi Markus, > > The output from the server side is correct. In the client, What > version of xmlsec are you using?. Are you creating the > org.w3c.Document namespace aware? > > Regards, > > Raul > > On 9/2/06, Markus Werner <[EMAIL PROTECTED]> wrote: >> Hi Sean, >> >> The server processes exactly the same message, since it is sent by the >> client to the server. Here is the abbreviated message I send to the >> server: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> >> <soap:Body> >> <xmks:RegisterRequest xmlns:xmks="http://www.w3.org/2002/03/xkms#" >> xmlns:ds="http://www.w3.org/2000/09/xmldsig#" [snip]> >> [snip] >> <xmks:PrototypeKeyBinding Id="_foobar"> >> [snip] >> </xmks:PrototypeKeyBinding> >> <xmks:Authentication> >> <xmks:KeyBindingAuthentication> >> <ds:Signature> >> <ds:SignedInfo> >> <ds:CanonicalizationMethod >> Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> >> <ds:SignatureMethod >> Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1" /> >> <ds:Reference URI="#_foobar"> >> <ds:Transforms> >> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> >> </ds:Transforms> >> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> >> <ds:DigestValue>FQcqlzTyFLwFBdJb5tgN1Vd3H+g=</ds:DigestValue> >> </ds:Reference> >> </ds:SignedInfo> >> <ds:SignatureValue>VchVOu8J+qwBuRTVjxECrV5xH+I=</ds:SignatureValue> >> <ds:KeyInfo> >> <ds:KeyName>XKMSInteropClient</ds:KeyName> >> </ds:KeyInfo> >> </ds:Signature> >> </xmks:KeyBindingAuthentication> >> </xmks:Authentication> >> </xmks:RegisterRequest> >> </soap:Body> >> </soap:Envelope> >> >> The server calculates the following digest input: >> >> <xmks:PrototypeKeyBinding xmlns:xmks="http://www.w3.org/2002/03/xkms#" >> Id="_foobar">[snip]</xmks:PrototypeKeyBinding> >> >> while the client calculates the following digest input: >> >> <xmks:PrototypeKeyBinding Id="_foobar">[snip]</xmks:PrototypeKeyBinding> >> >> The server-side uses another implementation of XML Signature that I >> don't know. The only thing I know is, that it is not Apache XML Security. >> >> TIA, >> Markus. >> >> >> Sean Mullan wrote: >> > I don't have enough information, but it sounds like when canonicalizing >> > on the client, it doesn't find the namespace definition for foo. Is it >> > defined by an ancestor of the bar element on the server but not on the >> > client? >> > >> > --Sean >> > >> > Markus Werner wrote: >> >> Hi Sean, >> >> >> >> thank you for your reply. The following lines of code provide the >> >> expected result: >> >> >> >> SignedInfo signedInfo = sig.getSignedInfo(); >> >> for (int i = 0; i < signedInfo.getLength(); i++) { >> >> Reference reference = signedInfo.item(i); >> >> // System.out.println(reference.getContentsAfterTransformation()); >> >> System.out.println(new String(reference.getReferencedBytes())); >> >> } >> >> >> >> The client-side output is something like the following: >> >> >> >> <foo:bar Id="ref0815">rest is the same</foo:bar> >> >> >> >> while the server-side output is as follows: >> >> >> >> <foo:bar xmlns:foo="http://www.asdf.org/foo#" Id="ref0815"> >> >> rest is the same</foo:bar> >> >> >> >> Both outputs seem to be correctly canonicalized, but the digest >> input on >> >> the server-side includes some addidional namespace-declaration in the >> >> opening tag of <foo:bar>. >> >> >> >> What can cause this? >> >> >> >> Thank you in advance, >> >> Markus. >> >> >> >> >> >> Sean Mullan schrieb: >> >>> I would try calling Reference.getContentsAfterTransformation >> (returns an >> >>> XMLSignatureInput) or Reference.getReferencedBytes (returns a >> byte[]), >> >>> each of which return the dereferenced and transformed contents >> before it >> >>> is digested. I haven't really used those methods so I'm hoping >> someone >> >>> on the list that is more familiar with them will send you some sample >> >>> code. >> >>> >> >>> --Sean >> >>> >> >>> Markus Werner wrote: >> >>>> Hi, >> >>>> >> >>>> first of all, I'm relatively new to Apache XML Security, so >> please be >> >>>> patient :-) >> >>>> >> >>>> My job is to sign an element inside a DOM-Document with the help >> of a >> >>>> secretKey. Let the element that should be signed be called <Foo> and >> >>>> its >> >>>> Id be "id" in beneath code snippet. The signature should be a >> detached >> >>>> signature. >> >>>> >> >>>> >> --------------------------------------------------------------------- >> >>>> private static Document sign( >> >>>> Document doc, String id, SecretKey secretKey) >> >>>> throws Exception >> >>>> { >> >>>> XMLSignature sig = new XMLSignature(doc, baseURI, >> >>>> XMLSignature.ALGO_ID_MAC_HMAC_SHA1, >> >>>> Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); >> >>>> >> >>>> Node root = doc.getFirstChild(); >> >>>> root.appendChild(sig.getElement()); >> >>>> >> >>>> Transforms transforms = new Transforms(doc); >> >>>> transforms.addTransform( >> >>>> Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS); >> >>>> >> >>>> sig.addDocument("#" + id, transforms, >> >>>> Constants.ALGO_ID_DIGEST_SHA1); >> >>>> sig.sign(secretKey); >> >>>> >> >>>> return doc; >> >>>> } >> >>>> >> --------------------------------------------------------------------- >> >>>> >> >>>> I'm working here on the client-side and the server responds, that >> there >> >>>> is something wrong with the digest value of the signed reference >> while >> >>>> the SignedInfo is correctly digested. >> >>>> >> >>>> To get sure what went wrong we have to compare the digest inputs >> (value >> >>>> after canonicalization) on both sides. I already got the >> canonicalized >> >>>> Element as String from the server-side and I should do the same >> with my >> >>>> implementation. >> >>>> >> >>>> When I use the following lines of code to save the document >> immediately >> >>>> before signing it I get the whole document in a canonicalized form. >> >>>> >> >>>> FileOutputStream f = new FileOutputStream("test.xml"); >> >>>> XMLUtils.outputDOMc14nWithComments(doc, f); >> >>>> >> >>>> But I only need the canonicalized form of the referenced element >> <Foo>. >> >>>> Is there some way to dump the canonical form of a Reference to a >> log or >> >>>> stdout? >> >>>> >> >>>> Best regards, >> >>>> Markus. >> > >
-- http://r-bg.com