I have a dynamic client application that is sending a signed SOAP request
to a service where an InclusiveNamespaces element contains a PrefixList
that is empty. The service rejects the payload with the error:

*Validation failed because:cvc-minLength-valid: Value '' with length = '0'
is not facet-valid with respect to minLength '1' for type 'NMTOKENS'.*

I took a look at the specs:

    https://www.w3.org/TR/xml-exc-c14n/


http://www.ws-i.org/profiles/basicsecurityprofile-1.1.html#InclusiveNamespaces

And it is not clear to me if PrefixList can be an empty string or not, but
this spec:

    https://www.w3.org/TR/2000/WD-xml-2e-20000814#NT-Nmtokens

indicates that it cannot.

I am using the following settings:


   - The "action" parameter is set to "Timestamp" and "Body"
   - The "signatureDigestAlgorithm" parameter is "
   http://www.w3.org/2000/09/xmldsig#sha1";
   - The "signatureParts" parameter is

"{Element}{
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body
";


Here is a snippet from the header of the outbound request. Note that the
Reference for the Timestamp contains values in the PrefixList, but the
reference associated with the Body does not:

<ds:SignedInfo>
    <ds:CanonicalizationMethod Algorithm="
http://www.w3.org/2001/10/xml-exc-c14n#";>
        <ec:InclusiveNamespaces xmlns:ec="
http://www.w3.org/2001/10/xml-exc-c14n#";
               PrefixList="soap">
        </ec:InclusiveNamespaces>
    </ds:CanonicalizationMethod>
    <ds:SignatureMethod Algorithm="
http://www.w3.org/2000/09/xmldsig#rsa-sha1";>
        </ds:SignatureMethod>

<ds:Reference URI="#TS-15">
    <ds:Transforms>
        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#";>
           <ec:InclusiveNamespaces xmlns:ec="
http://www.w3.org/2001/10/xml-exc-c14n#";
                PrefixList="ns1 ns2 ns3 ns4 soap">
           </ec:InclusiveNamespaces>
         </ds:Transform>
    </ds:Transforms>

    <ds:DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1";></ds:DigestMethod>

    <ds:DigestValue>hjy97p3MBjtA2IjdM/XzjHG9V6s=</ds:DigestValue>
</ds:Reference>

<ds:Reference URI="#id-16">
   <ds:Transforms>
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#";>
          <ec:InclusiveNamespaces xmlns:ec="
http://www.w3.org/2001/10/xml-exc-c14n#";
              *PrefixList**=""*>
         </ec:InclusiveNamespaces>
       </ds:Transform>
   </ds:Transforms>

   <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1
"></ds:DigestMethod>
   <ds:DigestValue>dknPQWZJt54NUo+dJKAWiG8oYz8=</ds:DigestValue>
</ds:Reference>

</ds:SignedInfo>

And here is the reference to the Body (id-16):

<soap:Body xmlns:wsu="
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity
 utility-1.0.xsd" wsu:Id="id-16">

Is an empty PrefixList valid?

If not, is there a way to control this programmatically as an outbound
interceptor? I saw the samples that use DefaultCryptoCoverageChecker, but
the samples use it as an inbound interceptor.

I am using CXF 2.7.8, WSS4j 1.6.11 and XMLSec 1.5.4.

Thanks,

Chris

Reply via email to