J'utilise xmlseclibs pour essayer de signer un document SOAP, mais cela ne semble pas canaliser les choses de la même manière selon que je signe ou que je valide.Quelle est la bonne canonicalisation XML exclusive?
Je vais vous donner un exemple. C'est le XML que je suis en train de signer:
<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>
Je suis un code de travail en PHP pour le signer en utilisant une combinaison de la clé publique et les certificats de clé privée, et il a semblé fonctionner. Il a ajouté l'élément <ds:Signature>
avec tout ce qu'il fallait, et ça avait l'air génial. Mais ensuite je l'ai testé en essayant immédiatement de le valider après l'avoir signé, toujours avec xmlseclibs (et le certificat de clé publique), mais la validation a échoué. Donc, la même bibliothèque de codes fait à la fois la signature et la validation, mais les deux processus ne sont pas d'accord pour une raison quelconque. J'ai ajouté du code de débogage à xmlseclibs pour savoir ce qu'il fait, et j'ai réalisé que la raison pour laquelle la clé de signature et la clé de validation sont différents sont parce que ça canonise les choses différemment dans les deux situations. Quand je dis à signer l'élément <samlp:Response>
, c'est la forme canonique, il signe (j'ai ajouté des nouvelles lignes ici pour la lisibilité):
<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>
Cependant quand il va valider la signature, c'est la forme canonique, il calcule pour valider contre (encore une fois, j'ai ajouté des sauts de ligne ici):
<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>
comme vous pouvez le voir, cette version omet l'attribut xmlns:saml
de l'élément <samlp:Response>
, alors que le premier ne fonctionne pas. (Notez que ceci est différent de l'attribut xmlns:samlp
, qui est inclus dans les deux.) Cela semble assez clair comme un bogue dans xmlseclibs, mais néanmoins c'est un que je serais heureux de réparer moi-même si je savais juste quelle forme canonique était correcte un. Cet attribut devrait-il être omis par une canonisation exclusive? Ou devrait-il être inclus? Lequel est la forme canonique exclusive correcte?
Cela ressemble à un bogue, vous devriez le publier dans le programme de suivi des problèmes de xmlseclibs. –