Problema verifica request - Check Strict - AuthnRequest Signature validation
sil-vio opened this issue · 2 comments
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
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.
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