Qual é a canonização exclusiva exclusiva para XML?

estou a usarxmlseclibs para tentar assinar um documento SOAP, mas ele não canoniza as coisas da mesma maneira, dependendo de eu estar assinando ou validando.

Eu vou te dar um exemplo. Este é o XML que estou tentando assinar:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"/>
</samlp:Status>
</samlp:Response>
</soapenv:Body>
</soapenv:Envelope>

Eu obtive algum código trabalhando em PHP para assiná-lo usando uma combinação de certificados de chave pública e chave privada, e parecia funcionar. Adicionou o<ds:Signature> elemento com todo o material adequado, e parecia ótimo. Mas testei-o tentando imediatamente validá-lo após assiná-lo, novamente com xmlseclibs (e o certificado de chave pública), mas a validação falhou. Portanto, a mesma biblioteca de códigos está assinando e validando, mas os dois processos não concordam por algum motivo.

Adicionei algum código de depuração ao xmlseclibs para descobrir o que está fazendo e percebi que a razão pela qual a chave de assinatura é criada e a chave de validação é diferente é porque ela canoniza as coisas de maneira diferente nas duas situações. Quando eu digo para assinar o<samlp:Response> elemento, esta é a forma canônica que assina (adicionei novas linhas aqui para facilitar a leitura):

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

No entanto, quando se trata de validar a assinatura, esta é a forma canônica que ele calcula para validar (novamente, adicionei novas linhas aqui):

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

Então, como você pode ver, esta versão omite oxmlns:saml atributo do<samlp:Response> elemento, enquanto o primeiro não. (Observe que isso é diferente doxmlns:samlp (que está incluído em ambos.) Isso parece claramente um bug no xmlseclibs, mas, mesmo assim, é um prazer em corrigir-me se soubesse qual forma canônica era a correta. Esse atributo deve ser omitido por canonização exclusiva? Ou deveria ser incluído? Qual é a forma canônica exclusiva correta?

questionAnswers(2)

yourAnswerToTheQuestion