Domanda

xmlseclibs per cercare di firmare un documento SOAP, ma lo fa non sembrano canonicalize le cose allo stesso modo a seconda che sto firmando o la convalida.

Ti do un esempio. Questa è l'XML che sto cercando di firmare:

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

ho avuto qualche codice funzionante in PHP per firmare utilizzando una combinazione di chiave pubblica e certificati a chiave privata, e tutto sembrava funzionare. Ha aggiunto l'elemento <ds:Signature> con tutta la roba corretta, e sembrava fantastico. Ma poi ho provato da subito cercando di convalidarla dopo averlo firmato, di nuovo con xmlseclibs (e il certificato di chiave pubblica), ma la convalida fallito. Così la stessa libreria di codice sta facendo sia la firma e la convalida, ma i due processi non sono d'accordo per qualche ragione.

Ho aggiunto un po 'di codice di debug per xmlseclibs per scoprire quello che sta facendo, e mi sono reso conto che la ragione per la chiave di firma si tratta con e la chiave di convalida si tratta con sono diverse sono perché canonicalizes cose in modo diverso nelle due situazioni . Quando dico per firmare l'elemento <samlp:Response>, questa è la forma canonica si firma (a capo ho aggiunto qui per migliorare la leggibilità):

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

Tuttavia, quando si va a convalidare la firma, questa è la forma canonica calcola per convalidare contro (a capo di nuovo, ho aggiunto qui):

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

Quindi, come si può vedere, questa versione omette l'attributo xmlns:saml dall'elemento <samlp:Response>, mentre il primo non lo fa. (Si noti che questo è diverso dall'attributo xmlns:samlp, che è incluso in entrambi.) Questo sembra abbastanza chiaramente come un insetto in xmlseclibs, ma comunque è uno Sarei felice di correggere me stesso se ho appena saputo che forma canonica è stata la corretta uno. Dovrebbe quell'attributo essere omesso da canonicalization esclusiva? O dovrebbe essere inclusa? Quale è la forma canonica esclusiva corretta?

È stato utile?

Soluzione

Si sta creando il documento DOM in modo improprio e cercando di utilizzare il malato albero in memoria. In entrambi i serializzare e utilizzare il risultato serializzato o creare correttamente le dichiarazioni di namespace nella struttura prima di provare a firmare. Vedere la segnalazione di bug per ulteriori informazioni: http://code.google. com / p / xmlseclibs / temi / dettaglio? id = 6

Altri suggerimenti

Né sono la canonica-forma corretta!

L'XML firma ha una dichiarazione dello spazio dei nomi che viene dopo gli attributi non-spazio dei nomi, che rompe la regola del documento d'ordine:

  

nomi nodi hanno una posizione dell'ordine documento minore di nodi attributo.

L'XML verifica manca completamente il nodo spazio dei nomi saml. Canonicalizzazione non rimuove i nodi dello spazio dei nomi solo perché non ci sono contenuti bambino che li fa riferimento. Si rimuove solo i nodi dello spazio dei nomi ridondanti (es. Spazi dei nomi che erano già in vigore alla madre).

Non so abbastanza di xmlseclibs per dire perché questo sta accadendo, ma è sicuramente sbagliato su entrambi i fronti. FWIW la funzione C14N sul mio DOM qui 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: Ho appena guardato xmlseclibs.php nel SVN, e non c'è una soluzione semplice per questo come il suo approccio attuale è fondamentalmente errata. Si tenta di creare un DOM “canonicalised” e poi serialises con pianura vecchio saveXML(). Come ci sono regole di serializzazione C14N su ordine attributi e carattere sfugge che saveXML non promette di seguire, non c'è modo questo può forse funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top