Hi all,
I'm having problems importing an XML Signature element into a SOAP
envelope. I can create the signature without problem, but when I
import the signature element into the SOAP header, all of the elements
in the entire SOAP envelope have a default namespace declaration of
xmlns="" added to them. Also, all sub-elements of the <ds:Signature
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> element have the
following redundant namespace declaration added to them:
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
Any idea how to prevent these changes from happening? (Note: the
problem also happens if I attempt to create the signature directly in
the soap header.)
Here are some code fragments I'm using to generate the signature and
import it into the soap header:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document doc = docBuilder.newDocument();
org.apache.xml.security.utils.Constants.setSignatu reSpecNSprefix("ds");
String baseURI = null;
XMLSignature signature = new XMLSignature(doc, baseURI,
XMLSignature.ALGO_ID_SIGNATURE_DSA);
signature.addResourceResolver(
new InputStreamReferenceResolver(getInputStream(),getC ontentType())
);
doc.appendChild(signature.getElement());
signature.addDocument(null, null,
org.apache.xml.security.utils.Constants.ALGO_ID_DI GEST_SHA1);
signature.sign(privateKey);
// Now import the signature into the SOAP header
SOAPMessage message = ...
SOAPPart soapPart = message.getSOAPPart();
SOAPHeader soapHeader = message.getSOAPHeader();
org.w3c.dom.Node signatureNode =
soapPart.importNode(signature.getElement(),true);
soapHeader.appendChild(signatureNode);
The resulting SOAP Envelope looks like this:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns="">
<SOAP-ENV:Header xmlns="">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns="">
<ds:SignedInfo xmlns=""
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315 "
xmlns="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" xmlns=""
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:Reference xmlns=""
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" xmlns=""
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:DigestValue xmlns=""
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
Vf8a/Rvic27UJqOhMqyIHYimSLw=
</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue xmlns=""
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
bMabvDDzk0g2KmP3Yb+ybaL+GwBN4sDFT+yuUuapWoZfILgNkx h90g==
</ds:SignatureValue>
</ds:Signature>
</SOAP-ENV:Header>
<SOAP-ENV:Body xmlns="">
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
When what I really want is this:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315 "/>
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/>
<ds:Reference>
<ds:DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>
Vf8a/Rvic27UJqOhMqyIHYimSLw=
</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
bMabvDDzk0g2KmP3Yb+ybaL+GwBN4sDFT+yuUuapWoZfILgNkx h90g==
</ds:SignatureValue>
</ds:Signature>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Thanks in advance ...
Steve