Pregunta

Estoy usando xmlseclibs para tratar de firmar un documento SOAP, pero lo hace no parece que canonicalize cosas de la misma manera dependiendo de si estoy o validar la firma.

Te voy a dar un ejemplo. Este es el código XML que estoy tratando de firmar:

<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>

Tengo algo de trabajo de código en PHP para firmar usando una combinación de certificados de clave pública y clave privada, y parece que ha funcionado. Se añade el elemento <ds:Signature> con toda la materia apropiada, y se veía genial. Pero luego he comprobado por tratar de inmediato para validar después de haberlo firmado, de nuevo con xmlseclibs (y el certificado de clave pública), pero el Error de validación. Por lo que la misma biblioteca exacta código está haciendo tanto la firma y validación, pero los dos procesos no están de acuerdo por alguna razón.

he añadido algo de código de depuración para xmlseclibs para averiguar lo que está haciendo, y me di cuenta de que la razón por la clave de firma que se le ocurre, y la clave de validación que se le ocurre son diferentes son porque canonicalizes cosas de manera diferente en las dos situaciones . Cuando le digo a firmar el elemento <samlp:Response>, esta es la forma canónica que firma (saltos de línea que he añadido aquí para facilitar la lectura):

<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>

Sin embargo, cuando se va a validar la firma, esta es la forma canónica se calcula para validar contra saltos de línea (de nuevo, que he añadido aquí):

<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>

Así como se puede ver, esta versión omite el atributo xmlns:saml del elemento <samlp:Response>, mientras que el primero no lo hace. (Tenga en cuenta que esto es diferente del atributo xmlns:samlp, que se incluye en los dos.) Esto parece bastante clara como un insecto en xmlseclibs, pero no obstante es uno estaría feliz de solucionar si yo sólo sabía lo que forma canónica fue la correcta uno. En caso de que el atributo de ser omitido por canonicalización exclusiva? O debe ser incluido? ¿Cuál es la forma canónica exclusiva correcta?

¿Fue útil?

Solución

Usted está creando el documento DOM inadecuadamente y tratando de utilizar la inválido árbol en la memoria. De cualquier serializar y utilizar el resultado en serie o crear correctamente las declaraciones de espacio de nombres en el árbol antes de intentar acceder. Ver el informe de error para obtener más información: http://code.google. com / p / xmlseclibs / temas / detalle? id = 6

Otros consejos

Tampoco lo son la forma canónica correcta!

La firma XML tiene una declaración de espacio que viene después de los atributos de no-espacio de nombres, que rompe la regla documento de pedido:

  

nodos espacio de nombres tienen una posición de orden documento menor que los nodos de atributo.

El XML de verificación no se encuentra el nombre de nodo saml por completo. Canonicalisation no elimina nodos espacio de nombres simplemente porque no hay contenido infantil que hace referencia a ellos. Es sólo elimina nodos de espacio de nombres redundantes (es decir. Espacios de nombres que ya estaban en efecto en la matriz).

No sé lo suficiente sobre xmlseclibs decir por qué ocurre esto, pero es sin duda equivocado en ambos casos. Fwiw la función C14N en mi DOM aquí dice:

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" 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>

eta: Yo miraba a xmlseclibs.php en el SVN, y no hay una solución fácil para esto ya que su enfoque actual es fundamentalmente defectuoso. Se trata de crear un DOM “canonicalised” y luego serialises con edad saveXML() llanura. Ya que hay reglas de serialización C14N sobre el orden de atributos y el carácter que se escapa saveXML no se compromete a seguir, no hay manera esto posiblemente puede trabajar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top