italia / spid-sp-test

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

Problematiche relative alla firma dei metadata #90

Closed mperu92 closed 3 years ago

mperu92 commented 3 years ago

Buongiorno, stiamo provando ad implementare SPID su un nostro portale per un cliente che è un ente pubblico, ma siamo ancora nella fase di generazione / firma del certificato. Tramite questo tool, abbiamo generato i tre file (crt.pem csr.pem key.pem) Una volta ottenuti, con openssl tramite il comando pkcs12 -export -out cert.pfx -inkey key.pem -in crt.pem abbiamo generato il file .pfx. Una volta fatto questo, tramite uno script abbiamo ottenuto il base64 del .pfx. A questo punto, avendo i certificati ci siamo un po' bloccati perché non ci è chiarissimo il da farsi. Ci è stato suggerito di prendere come spunto un file presente all'interno di questo progetto per ente pubblico public-sp.xml. Abbiamo quindi preso questo file e abbiamo modificato i dati con i nostri. Abbiamo creato il virtual enviroment di pyhton, e quindi installato spid-sp-test.

Lanciando il comando spid_sp_test --metadata-url file://cndcec_metadata.xml o anche lanciando il comando xmlsec1 --sign --insecure --privkey-pem key.pem --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntityDescriptor cndcec_metadata.xml > cndcec_metadata_signed.xml solo per la parte relativa alla signature, ci viene triggerato questo errore (tra l'altro l'unico)

func=xmlSecOpenSSLX509CertificateNodeRead:file=x509.c:line=956:obj=x509:subj=xmlSecOpenSSLX509CertBase64DerRead:error=1:xmlsec library function failed:
func=xmlSecOpenSSLX509DataNodeRead:file=x509.c:line=886:obj=x509:subj=xmlSecOpenSSLX509CertificateNodeRead:error=1:xmlsec library function failed:node=X509Certificate
func=xmlSecOpenSSLKeyDataX509XmlRead:file=x509.c:line=663:obj=x509:subj=xmlSecOpenSSLX509DataNodeRead:error=1:xmlsec library function failed:
func=xmlSecKeyInfoNodeRead:file=keyinfo.c:line=121:obj=x509:subj=xmlSecKeyDataXmlRead:error=1:xmlsec library function failed:node=X509Data
func=xmlSecKeysMngrGetKey:file=keys.c:line=1234:obj=unknown:subj=xmlSecKeyInfoNodeRead:error=1:xmlsec library function failed:node=KeyInfo
func=xmlSecDSigCtxProcessKeyInfoNode:file=xmldsig.c:line=793:obj=unknown:subj=unknown:error=45:key is not found:details=NULL
func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=508:obj=unknown:subj=xmlSecDSigCtxProcessKeyInfoNode:error=1:xmlsec library function failed:
func=xmlSecDSigCtxVerify:file=xmldsig.c:line=346:obj=unknown:subj=xmlSecDSigCtxProcessSignatureNode:error=1:xmlsec library function failed:
Error: signature failed

Che sembra essere relativo proprio al base64 del certificato che abbiamo generato. Ed effettivamente ci sono delle incongruenze tra l'xml di esempio e quello nostro. Nell'xml di esempio, i due parametri <KeyInfo> hanno base64 differenti, inoltre nel secondo parametro <KeyInfo> all'interno del segmento <KeyDescriptor> i base 64 sono diversi, separati da spazi, come se fossero una lista.

Noi nel nostro file in entrambi i segmenti abbiamo inserito sempre lo stesso base64 che abbiamo generato. nella documentazione che abbiamo letto su https://docs.italia.it/italia/spid/spid-regole-tecniche/it/stabile/metadata.html ci viene detto che l’elementoche contiene l’elenco dei certificati e delle corrispondenti chiavi pubbliche dell’entità, utili per la verifica della firma dei messaggi prodotti da tale entità nelle sue interazioni con le altre (SAMLMetadata, par. 2.4.1.1)

A questo punto non sappiamo oltre a quello generato da noi, quali siano gli altri certificati dell'elenco di cui si parla. Lanciando il tool sembra proprio che l'unica failure sia proprio questa, non vengono riportati altri errori.

Questo il nostro file xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<md:EntityDescriptor
    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:spid="https://spid.gov.it/saml-extensions" ID="a088bc6e-33c5-4ff2-b35b-d9c3ff9a2c9e" entityID="https://publicsp.it/">

<ds:Signature Id="Signature1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#a088bc6e-33c5-4ff2-b35b-d9c3ff9a2c9e">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue />
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue />
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIQDQIBAzCCD8kGCSqGSIb3DQEHAaCCD7oEgg+...[HASH INCOMPLETO]</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>

    <md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
        <md:KeyDescriptor use="signing">
            <ds:KeyInfo>
                <ds:X509Data>
                    <ds:X509Certificate>MIIQDQIBAzCCD8kGCSqGSIb3DQEHAaCCD7oEgg+...[HASH INCOMPLETO]</ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </md:KeyDescriptor>
        <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://eventi.commercialisti.it/slo"/>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
        <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://publicsp.it/sso" index="0" isDefault="true"/>
        <md:AttributeConsumingService index="0">
            <md:ServiceName xml:lang="it">ServiceName</md:ServiceName>
            <md:RequestedAttribute Name="spidCode"/>
            <md:RequestedAttribute Name="familyName"/>
            <md:RequestedAttribute Name="name"/>
            <md:RequestedAttribute Name="companyName"/>
            <md:RequestedAttribute Name="fiscalNumber"/>
            <md:RequestedAttribute Name="ivaCode"/>
            <md:RequestedAttribute Name="email"/>
            <md:RequestedAttribute Name="gender"/>
            <md:RequestedAttribute Name="placeOfBirth"/>
            <md:RequestedAttribute Name="countyOfBirth"/>
            <md:RequestedAttribute Name="dateOfBirth"/>
        </md:AttributeConsumingService>
    </md:SPSSODescriptor>
    <md:Organization>
        <md:OrganizationName xml:lang="it">publicsp</md:OrganizationName>
        <md:OrganizationDisplayName xml:lang="it">Consiglio Nazionale dei Dottori Commercialisti e degli Esperti Contabil</md:OrganizationDisplayName>
        <md:OrganizationURL xml:lang="it">https://publicsp.it</md:OrganizationURL>
    </md:Organization>
    <md:ContactPerson contactType="other">
        <md:Extensions>
            <spid:IPACode>ipa</spid:IPACode>
            <spid:Public/>
        </md:Extensions>
        <md:EmailAddress>info@public-sp.it</md:EmailAddress>
    </md:ContactPerson>
</md:EntityDescriptor>

Quali possono essere i nostri errori/mancanze che non permettono la signature del nostro xml? Grazie mille in anticipo

peppelinux commented 3 years ago

Il problema è nel certificato, nel suo formato. Guardate i certificati già presenti in spid-sp-test

Stampate con openssl le informazioni di debug, probabilmente dovete fare una conversione di formato prima di usarlo con xmlsec1

mperu92 commented 3 years ago

Si abbiamo visto i certificati, grazie mille! Volevamo solo sapere, prendendo l'xml di esempio public-sp.xml, all'interno dei due parametri che si trovano uno all'interno del segmento <ds:Signature > e l'altro all'interno del segmento <md:SPSSODescriptor >. Qual'è l'effettiva differenza? Nel senso è lo stesso certificato?

peppelinux commented 3 years ago

Uno indica con quale certificato è verificabile la firma e l'altro indica con quale certificato validare lauthn request.

Effettivamente in spid-sp-test li ho rifirmati per gli scopi dei tests, non vanno bene come esempio canonico, correggerò per chiarezza.

Tu puoi avere anche più di un certificato. Nel tuo caso, per semplicità, usa un solo certificato

peppelinux commented 3 years ago

La risposta è sì, falli essere uguali

mperu92 commented 3 years ago

Ha funzionato! Lanciando xmlsec1 --sign.... e successivamente spid_sp_test --metadata-url file://metadata.xml Il tool ha runnato restituendo alla fine Spid QA: executed 91 tests, 0 failed. 0 warnings.

A questo punto, avendo fatto questi passaggi (generazione cert, metadata signed e test passato senza errori), qual è il passaggio successivo? Dobbiamo fare ancora qualcos'altro prima di integrare nella nostra applicazione?

Grazie mille ancora

peppelinux commented 3 years ago

Devi testare --authn-url eppoi le response con -tr Aggiungi --extra per completezza

peppelinux commented 3 years ago

Chiudo questo thread Apriamome un altro eventualmente per gestire gli altri argomenti emersi