italia / spid-sp-test

SAML2 SPID/CIE Service Provider validation tool
European Union Public License 1.2
39 stars 17 forks source link

Problema verifica request - Check Strict - AuthnRequest Signature validation #157

Closed sil-vio closed 1 year ago

sil-vio commented 1 year ago

Ciao, utilizzando il validatore online dell'ambiente demo AGID https://demo.spid.gov.it/validator ho un problema nella verifica della AuthnRequest prodotta.

In particolare con Binding: HTTP-Redirect e seguente request:

<?xml version="1.0"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_0ec44290adfd1aeb1f7364eb96b146ee" Version="2.0" IssueInstant="2023-02-01T10:12:48.163Z" Destination="https://demo.spid.gov.it/validator/samlsso" AssertionConsumerServiceIndex="0" AttributeConsumingServiceIndex="0" ForceAuthn="true">

    <saml:Issuer NameQualifier="https://idp-svil.tdnet.it" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">
        https://idp-svil.tdnet.it
    </saml:Issuer>

    <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>

    <samlp:RequestedAuthnContext Comparison="minimum">
        <saml:AuthnContextClassRef>
            https://www.spid.gov.it/SpidL2
        </saml:AuthnContextClassRef>
    </samlp:RequestedAuthnContext>

</samlp:AuthnRequest>

Effettuando la validazione ho il seguente check in errore:

23 | AuthnRequest Signature validation | failure - value: Verification Failure

Se interpreto bene le regole tecniche per la AuthnRequest qui :

https://docs.italia.it/italia/spid/spid-regole-tecniche/it/stabile/single-sign-on.html#authnrequest

l'elemento <Signature> deve essere presente solo in caso di binding HTTP POST.

L'ambiente demo vedo utilizzare: SPID Validator - 1.9.4, SPID SP Test - 1.2.11

La redirect viene fatta passando nella uri sia sigAlg che signature come query param:

RelayState=MjIyMjIy&SAMLRequest=nJNBb9s+DMXPyacQdI+juP/8OwuxiyBBAQPdsDXDDrsMisW0BCzJE2kn/faDnWTzsLWH+Wi+R//4SK/uTq4WHUTC4HO5SJS8K8R0siLj6kavW372j/C9BWJxcrUnPRRy2UavgyEk7Y0D0lzp3fr9g04TpZsYOFShliPL2w5DBJExeCnKbS6//W8Wt4sUDpn6DyCzJlPV/t2yf4zaWwtSfLkip4mSoiRqofTExnMuU5XezFQ6U+lnleml0je3iVpmX6XYAjF6w4PzmbkhPZ9Tg3bWmRqt4RBhRh3WCVsPnCDPe3iiIIVYXyE3wVPrIO4gdlhB6S2ccqmkEJM1c8R9y3DWoH/6QzS5D7GCIdlccmxBFpe89TBGFB+Mg0+tqfGAEH9xom1+Z5PiPkRn+O1s+zdoZ4dBqsEz8ossXm26mo9QiulkKoQQl3Powcrtx1Bj9fIP3+ZoPCF4lvNi3PZyYGCHUDbBM5xYbIJrTETqV+XQo2udLM45jXWb2hA9wuHnRMfjMelXmjyFrl/grkH7kF7G+qvzXHuFo5hey+OfofgRAAD//w==&SigAlg=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256&Signature=w1VDRixlPqOLYY3xJNBw79sGU+FfPSggvhhGN/A8Jnu+C65uCr3YWuTQ6ottRePiEcvDfzmEQyd4jYF0VbmFNh5Ki2fIJUe5ufgyCTE3fYueCfg9IQB7NifpY/c9ZHIwBcwhd2y1q99Lx2tj07R/4sQ3OnYXPF0C1u73U1yRvWWIMm44BLI8ryQ/bo0+T8RRIsob1geTtz9YvGDUH3RHou1ecyI76Eoq9cgxUDLqQLW5C43P+rOABtLWBkjgiseseWGOtDS1IV/ku3SE7bd5V59GkyVQ+2evDlCczfPCTxmpB8YEp9Iw4dfQsKDw5HcvxUhBi9lLzY6C2ejes4ebIw==

I metatada dell'idp di prova sono scaricabili a questa url:

https://idp-svil.tdnet.it/metadata

Grazie

validator_1 validator_2

sil-vio commented 1 year ago

Ciao, il problema è l'ordine dei parametri dei query param utilizzati per generare il payload da firmare e da aggiungere al query param Signature. In particolare utilizzando la libreria spid-go, che utilizza la funzione Encode della libreria standard l'ordine dei query param non viene preservato ma ordinato in modo alfabetico, di seguito la signature del metodo :

// Encode encodes the values into ``URL encoded'' form
// ("bar=baz&foo=quux") sorted by key.
func (v Values) Encode() string {

In questo modo RelayState viene aggiunto prima di SAMLRequest e questo genera una firma su un payload differente rispetto a quello che si aspetta spid-sp-test. spid-sp-test calcola il payload per la verifica della firma mettendo nel seguente ordine i parametri SAMLRequest, RelayState, SigAlg.

Modificando il codice e forzando l'ordine nel payload da firmare l'errore nel check 23 è sparito. Leggendo qui https://docs.italia.it/italia/spid/spid-regole-tecniche/it/stabile/trasmissione.html# non riesco a capire se l'ordine dei parametri è obbligatorio nel payload di firma e se nella redirect questi possono essere in ordine differente.

peppelinux commented 1 year ago

Ciao, grazie per questa importante analisi

questa versione appena rilasciata risolve la problematica che ci hai notificato: https://github.com/italia/spid-sp-test/releases/tag/v1.2.12