ministero-salute / dcc-utils

Set of utilities to read EU Digital COVID Certificates, verify signatures and rules.
GNU Affero General Public License v3.0
65 stars 16 forks source link

Renderlo un SDK ufficiale? #16

Closed dcannova closed 2 years ago

dcannova commented 2 years ago

Stiamo testando da tempo in azienda un sistema di verifica green pass basato su dcc-utils.

Lo abbiamo integrato con la verifica della signatures e delle rules, il tutto incapsulato in un webservice che gira con express.

Node mi sembra la piattaforma più integrabile di tutte, è un bel problema cercare di integrare solo la versione Android. Sarebbe bello rendere anche questo dcc-utils un SDK ufficiale da utilizzare in linea col DPCM del 12/10.

lucadentella commented 2 years ago

vedo che è stata aperta una issue simile anche nel repository dell'SDK, ne aggiungo qui il link per cross-reference: https://github.com/ministero-salute/it-dgc-verificac19-sdk-android/issues/24

Giuseppe-1977 commented 2 years ago

Anch'io sto usando node js, ma se approfondite nella validazione, scoprite una cosa carina. Nella DIgital Green Certificazion Key che si scarica dopo averla decriptata con la chuave assegnata ad ogni paese la data di scadenza del green pass è fissata al 12/05/20023 (per l'Italia) Ve ne siete resi conto? Come gestiranno i green pass che sono rilasciati temporaneamente? C'è un buco... sarà rilasciato qualcosa a breve..

lucadentella commented 2 years ago

Giuseppe

quella data di scadenza non è utilizzata in nessun processo di validazione: controlla il codice sorgente dell'app VerificaC19 per conferma. Il controllo sulla validità viene fatta scaricando le diverse durate (vaccinazione, tampone molecolare...) dal sito del Ministero.

Giuseppe-1977 commented 2 years ago

Ho fatto tutte le verifiche. La Verifica C19 si basa su quello che hai precedente indicato, ma la data di scadenza fa parte della verifica oltre alla complessa gestione delle chiavi che si scarica da un API JSON REST del ministero. E li trovi tutto.. oltre le chiavi incrociate. Questo processo si evince dalla lettura del codice. Non ti mando le righe di codice qui, ma se vuoi ti faccio vedere. Come non è gestita la quarantena, il green pass è sempre valido... testato su casi reali. E nella verifica da APP non ci sono regole differenziate se hai fatto vaccino o tampone molecolare. Fanno un controllo su due numeri serializzati, una è la issued date e una e la expiration date. Non ci sono storie, questo è il codice. Altrimenti se sei convito girami tu qual è l' API del ministero che chiamano per fare le verifiche che dici te... Secondo me hanno sbagliato proprio a diffondere questa SDK, perchè ci sono molti buchi di processo.

lucadentella commented 2 years ago

Giuseppe

E nella verifica da APP non ci sono regole differenziate se hai fatto vaccino o tampone molecolare

Qui trovi il codice dell'SDK: https://github.com/ministero-salute/it-dgc-verificac19-sdk-android/blob/develop/sdk/src/main/java/it/ministerodellasalute/verificaC19sdk/model/VerificationViewModel.kt

fun getCertificateStatus(cert: CertificateModel): CertificateStatus {
        if (!cert.isValid) {
            return if (cert.isCborDecoded) {
                CertificateStatus.NOT_VALID
            } else
                CertificateStatus.NOT_EU_DCC;
        }
        cert.recoveryStatements?.let {
            return checkRecoveryStatements(it)
        }
        cert.tests?.let {
            return checkTests(it)
        }
        cert.vaccinations?.let {
            return checkVaccinations(it)
        }
        return CertificateStatus.NOT_VALID
    }

Come vedi fa controlli specifici in base alla tipologia di green pass.

Se invece stai asserendo che non è possibile revocare un GP, hai assolutamente ragione.

lucadentella commented 2 years ago

la data di scadenza fa parte della verifica

ecco qui invece mi piacerebbe vedere lo snippet del codice perché non ho trovato nulla a riguardo... grazie!

Giuseppe-1977 commented 2 years ago

Se guardi il boolean .isvalid trovi quello che dico. Dopo ti mando il codice su come viene valorizzato, sono fuori casa. Quel primo check riguarda la scadenza. Se superato fa il controlli che dici. Poi non ci sono revoche, come dici te, buco enorme. A stasera.

Giuseppe-1977 commented 2 years ago

Sono riuscito a trovare un attimo di tempo. Ho messo il break point navigando in debug.. da Android Studio... Ho evidenziato la property .ISVALID che ti dicevo.. e dentro oltre a tutto quello che hai detto c'è anche quella data di scadenza recuperata dal CBOR. un JSON decriptato dalle chiavi pubblicate... via API JSON REST.

Cattura

Fammi sapere cosa ne pensi. Ecco il JSON con chiave Italiana, e ho evidenziata il notAfter, che è il campo sotto esame da me!

"NJpCsMLQco4=": { "serialNumber": "46576ee6bb1fac3799b43071ac9f92ba332bd88b", "subject": "C=IT, O=Ministero della Salute, CN=Italy DGC DSC 1", "issuer": "C=IT, O=Ministero della Salute, CN=Italy DGC CSCA 1", "notBefore": "2021-05-12T08:18:17.000Z", "notAfter": "2023-05-12T08:11:59.000Z", "signatureAlgorithm": "RSASSA-PKCS1-v1_5", "fingerprint": "8ff39d880aa2fb3628a8e49020074cc44cdc61f0", "publicKeyAlgorithm": { "hash": { "name": "SHA-256" }, "name": "ECDSA", "namedCurve": "P-256" }, "publicKeyPem": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnL9+WnIp9fvbcocZSGUFlSw9ffW/jbMONzcvm1X4c+pXOPEs7C4/83+PxS8Swea2hgm/tKt4PI0z8wgnIehojw==" },

Nel codice troverai object EXPIRATION : CwtHeaderKeys(4)...

è un valore numerico da convertire... e guarda caso è uguale a quello del JSON.

Comunque se vai in debug è un attimo.. vedi tutto.

Metti anche un debug qui:

image

Bisognerebbe fare una prova con chi ha avuto un Green pass temporaneo, e vedere quella expirationDate.

Nel mio caso, ma anche quelli dei miei familiari, il sistema restituisce 12 Maggio 2023, e abbiamo fatto due dosi, quindi non abbiamo un Green pass temporaneo e non scade dopo un anno dalla seconda dose. Come è possibile?

Per come vedo io non recepisce le ultime normative sui Green Pass temporanei. Mi piacerebbe andare in debug su quelli per chiudere il cerchio.

lucadentella commented 2 years ago

grazie, mi era sfuggito quel controllo preliminare.

quindi non abbiamo un Green pass temporaneo e non scade dopo un anno dalla seconda dose. Come è possibile?

in realtà se guardi il codice che ti ho indicato sopra, il controllo sulla data viene fatto in base a business rules diverse per l'evento che ha generato il GP (vaccinazione...). L'SDK scarica periodicamente dal sito del Ministero un JSON con tutte le durate (in modo che sia possibile cambiarle, ad esempio quando hanno introdotto le 72 ore per i tamponi molecolari).

Nel caso che indichi (vaccinazione), ad esempio:

1) definisco le date di validità in base a quale dose è stata fatta, qui ad esempio se è la seconda:

                it.last().doseNumber >= it.last().totalSeriesOfDoses -> {
                    var startDate: LocalDate
                    var endDate: LocalDate
                    //j&j booster
                    if (it.last().medicinalProduct =="EU/1/20/1525" && it.last().doseNumber>it.last().totalSeriesOfDoses)
                    {
                         startDate = LocalDate.parse(clearExtraTime(it.last().dateOfVaccination))

                         endDate = LocalDate.parse(clearExtraTime(it.last().dateOfVaccination))
                             .plusDays(
                                 Integer.parseInt(getVaccineEndDayComplete(it.last().medicinalProduct))
                                     .toLong())
                    }

i metodi di lookup (getVaccineEndDayComplete()...) leggono i dati dal JSON:

    fun getVaccineEndDayComplete(vaccineType: String): String {
        return getValidationRules().find { it.name == ValidationRulesEnum.VACCINE_END_DAY_COMPLETE.value && it.type == vaccineType }?.value
            ?: run {
                ""
            }
    }

e quindi il GP è controllato in base a tali date (rispetto alla data odierna):

                    return when {
                        startDate.isAfter(LocalDate.now()) -> CertificateStatus.NOT_VALID_YET
                        LocalDate.now()
                            .isAfter(endDate) -> CertificateStatus.NOT_VALID
                        else -> CertificateStatus.VALID
                    }
                }

in definitiva quindi la logica è tutta implementata (hardcoded nella implementazione italiana, usando un motore di business rules per altri stati), quel controllo preliminare sulla data di "scadenza" del GP attualmente fino al 2023 darà sempre esito positivo e non è realmente usato per consentire di variare le validità (un altro caso è quando hanno esteso a 365gg la validità del GP vaccinale) senza ri-emetterli. bye

Giuseppe-1977 commented 2 years ago

Grazie mille,.ci siamo chiariti meglio. Dopo andró in debug in modo piú preciso sul mio Green Pass con queste tue considerazioni.

Giuseppe-1977 commented 2 years ago

Ecco qui il JSON con i settings delle varie scadenze:

https://get.dgc.gov.it/v1/dgc/settings

Grazie per il prezioso confrontro.

Giuseppe-1977 commented 2 years ago

Invece nella parte Node JS.. tutti questi controlli in che parte del codice li trovo? Perchè stavo guardando.. ma mi sfuggono.

lucadentella commented 2 years ago

se intendi la libreria in questione (dcc-utils), non ci sono: la libreria è già predisposta per valutare le regole in formato "europeo", vedi questo esempio: https://github.com/ministero-salute/dcc-utils/blob/master/examples/check_rules_from_api.js

ma non essendo ancora caricate quelle italiane, è necessario implementare la logica nei propri client che utilizzano questa libreria (come ho fatto nel mio progetto https://github.com/lucadentella/raspberry-dgc )

FrancescoBonizzi commented 2 years ago

@lucadentella Le regole non sono queste, giusto? Questi sono solo i valori di riferimento? https://get.dgc.gov.it/v1/dgc/settings

lucadentella commented 2 years ago

esattamente, le regole che utilizzano quei parametri sono attualmente hardcoded (vedi #4 come spiegazione di dettaglio e #17 )

FrancescoBonizzi commented 2 years ago

Grazie @lucadentella! Speriamo le espongano presto!

dcannova commented 2 years ago

È interessante che una semplice richiesta abbia generato un thread così ricco. Da qui si deduce un certo(direi ovvio) interesse per questa piattaforma, appunto più integrabile di tutte. Quando ho scoperto che esisteva solo la versione Android, sono rimasto un po' scioccato. Spero che si venga al punto del rendere le dcc-utils valide ai fini del DPCM del 12/10.

Perché? 1 - sono già solo ed unicamente una libreria, non un app con dentro una libreria. 2 - sono appunto integrabili in qualsiasi piattaforma/soluzione, mentre integrare una libreria di un app android dentro una soluzione al di fuori di android richiederebbe per forza di cose un minimo di rielaborazione del codice e quindi sostanzialmente un utilizzo non "puro" della libreria per com'è. 3 - in caso di controllo da parte delle autorità, è piuttosto facile dimostrare l'utilizzo delle librerie ufficiali anche aprendo semplicemente il package.json e al più controllando qualche chiamata alla libreria.

Giuseppe-1977 commented 2 years ago

Certo che mettono sotto il cappello ministero il codice sdk (per Android e IOS) e mettono sotto node js un qualcosa ... che non è neanche completo, almeno per le scadenze. Se non ci sbatti un attimo la testa e sei leggero non ti renderesti conto che out of the box cosi come è non è integrabile. La parte node JS, anche per me quella più fortemente indicata per essere integrabile ... è carente. Speriamo che facciano un upgrade ... altrimenti se uno si mette a replicare le logiche dell'APP e commette degli errori, di chi è la responsabilità poi ?

FrancescoBonizzi commented 2 years ago

Penso che questo possa interessare, è di oggi: https://www.ilsole24ore.com/art/green-pass-bozza-dpcm-controlli-non-oltre-48-ore-prima-AEEXQNp

Il Dpcm in bozza modifica e semplifica le possibilità di controllo della certificazione verde in quanto estende a privati e Pa la possibilità di utilizzare le App SDK (Software Development Kit, ovvero un Kit che consente di realizzare applicazioni specifiche per la verifica del green pass, integrando nel software le stesse funzionalità dell’app VerificaC19), NoiPA (il sistema del Mef che gestisce circa 1,9 milioni di dipendenti pubblici) e Portale Inps che consentono la verifica automatizzata (finora i privati erano costretti a una verifica manuale con App VerificaC19, soluzione quest’ultima che non è comunque esclusa, ma risulta residuale). Di fatto, la procedura di controllo per i privati è semplificata.

Mi sembra però che il repo NodeJs non sia considerato un SDK. O sbaglio?

dcannova commented 2 years ago

@Giuseppe-1977

Difatti è un codice sorgente incompleto di per se, ma fa il grosso del lavoro. Quel che ad esempio ho implementato per renderlo un webservice con qualche ottimizzazione tipo il recupero di chiavi, regole offline ogni tot ore e l'applicazione di queste a seconda del tipo di green pass, date etc... è tutto sommato ben poca cosa.

lucadentella commented 2 years ago

ciao

@FrancescoBonizzi l'allegato H del DPCM indica esplicitamente l'SDK Android (c'è addirittura il link al repo github) quindi per ora a norma di legge sei in regola solo se sviluppi la tua app usando tale SDK:

https://www.governo.it/sites/governo.it/files/Dpcm_12_ottobre_ALLEGATO_H.pdf

dcannova commented 2 years ago

A me starebbe anche benissimo "buttar via tutto" ed utilizzare l'ipotetico servizio REST citato qui:

image

I cosiddetti "motivi prestazionali" li hanno anche i privati, mettere un cellulare android a fare il server REST per essere in regola con la normativa mi farebbe sorridere.

Giuseppe-1977 commented 2 years ago

@dcannova

Sicuramente, Il problema che se cambia il DPCM devi rimetterci le mani e soprattutto sulle regole della validazione che qui in Italia è il CORE politico e di gestione. Senza dubbio è un punto di partenza, ma siamo lontani da un servizio di integrazione snello che dovresti prendere cosi come è, senza entrare nelle logiche. Quindi fin tanto che non rilasciano l'ufficilità dell'integrazione con NODE JS rimane un bel rischio interno soprattutto.

Se ipotizzano un servizio REST ufficiale, come hai indicato nel precedente POST. non sarebbe male in generale... però questo vuol dire trattare il CF, dato sensibile.. :-)

FrancescoBonizzi commented 2 years ago

Per me l'ideale sarebbe che validassero la libreria NodeJs, magari già con la definizione di una Web API autenticata, in modo che uno possa fare clone e pubblicarla su qualunque host del mondo e se la interroghi.

astagi commented 2 years ago

Si, attualmente è possibile utilizzare solo l'SDK Android, ma ci stiamo muovendo per supportare anche Node e Python. A breve spero di darvi maggiori info.

dcannova commented 2 years ago

Ottima notizia!

sirol81 commented 2 years ago

Si, attualmente è possibile utilizzare solo l'SDK Android, ma ci stiamo muovendo per supportare anche Node e Python. A breve spero di darvi maggiori info.

sarebbe fantastico! ma visto che al momento come giustamente dici tu è ufficiale solo SDK android, si potrebbe avere qualche dritta anche nelle issues di là? siamo in molti a navigare in acque poco chiare (la documentazione su come referenziare gli oggetti è un po' carente) e bisogna scervellarsi sul progetto VerificaC19 per avere esempi concreti di come utilizzare il LoadKeysWorker e VerificationViewModel

lcfr-dev commented 2 years ago

Ciao ragazzi, io mi sono interfacciato con il sistema greenpass in luglio, quando ancora non si sapeva come sarebbe stato implementato in Italia. Non esistendo documentazione italiana, mi sono basato sul quella europea (Link) GitHub. Sono paratito dalla pagina indicata, per poi proseguire fino a studiare quasi tutto il sistema Greenpass. Per il caso dell'Italia, sono 3 le API da tenere in mente: Status, Update e Rules. La status vi permette di ottenere gli identificatori dei certificati validi. La Update vi permette di ottenere la coppia KID-Certificate singolamente, e dovete farla finchè non ottenete l'errore 204. La rules/settings vi permette di ottenere le info per validare i greenpass (le rules italiane non seguono lo standard del green pass europeo, perciò dovrete sbatterci la testa). Per ottenere le coppie KID-Certificate usate un while, dovete passare solo un parametro ogni volta che è il x-resume-token che trovate nella respose precedente.

dcannova commented 2 years ago

Nessuno mette in dubbio che grosso modo si deve procedere a questo maniera ed anche io ho fatto una cosa del genere, tuttavia la normativa vuole appunto che il codice sorgente che effettua tutto il processo di decodifica e validazione, sia al 100% una libreria ufficiale. Da qui tutto il senso di questo issue.

lcfr-dev commented 2 years ago

Sono d'accordo con te @dcannova, la mia risposta era per quelli che sono persi nei meandri del greenpass. Solo qui in italia si stanno ponendo così tanti limiti, altrove non si sono limitazioni del genere. Inoltre il greenpass è già lacunoso di suo, visto che può essere bypassato con facilità dai vaccinati positivi al covid (non scherzo) perchè non è MAI stato previsto un modo per revocare singoli certificati, ma solo dopo la scadenza. Un'esempio eclatante di questo BUG è l'app IO, che mantiene nelle comunicazioni tutti i green pass, permettendo a tutti i positivi/recovery che hanno ripreso (sfortunamente) il covid, di farla franca, visto che bastano delle foto, o soltanto usare un green pass valido.

dcannova commented 2 years ago

Si, i singoli certificati non si possono revocare, purtroppo. Qui però, a prescindere dal sistema che ha questa grave lacuna, si spera nell'onestà del cittadino. Come non andrà in giro con un green pass altrui, così non andrà con un suo green pass "invalido". Non vorrei si vada però off topic, il nostro fine è essere in regola con la procedura così come descritta dal DPCM.

Giuseppe-1977 commented 2 years ago

A me pare assurdo, al di la delle osservazioni personali di tuti, che non fanno una piega, che viene aperto un canale GIHUB targato Ministero della Salute dove c'è SDK Android e IOS (Ufficiali) e il resto solo abbozzato e neanche certificato. Scusate lo sfogo, ma davvero è incomprensibile.

niccolofanton commented 2 years ago

A me pare assurdo, al di la delle osservazioni personali di tuti, che non fanno una piega, che viene aperto un canale GIHUB targato Ministero della Salute dove c'è SDK Android e IOS (Ufficiali) e il resto solo abbozzato e neanche certificato. Scusate lo sfogo, ma davvero è incomprensibile.

La situazione dal lato loro é molto caotica in questo momento, il governo ha annunciato le direttive in breve tempo, il pacchetto dcc-utils esisteva ancora prima dell'ufficialità come tool di testing/studio e quindi adesso é in questo limbo di non ufficialità. Portiamo un attimo di pazienza, il problema é stato segnalato e mi sembra che gli sviluppatori stiano provando a farlo diventare ufficiale!

Giuseppe-1977 commented 2 years ago

@niccolofanton giusto per capire, lei fa parte del gruppo di Sviluppo e Tecnico del Ministero? Perchè si sta esponendo in modo ufficiale cosi. Mi fa piacere che ci sia lo sforzo per renderlo operativo questa forma di integrazione.

niccolofanton commented 2 years ago

@niccolofanton giusto per capire, lei fa parte del gruppo di Sviluppo e Tecnico del Ministero? Perchè si sta esponendo in modo ufficiale cosi. Mi fa piacere che ci sia lo sforzo per renderlo operativo questa forma di integrazione.

No, non faccio parte del team, stavo facendo riferimento al commento di ieri di @astagi

dcannova commented 2 years ago

Ieri ci deve essere stato qualche problema nei webservice di https://get.dgc.gov.it/ che ha provocato malfunzionamenti nell'app verificac19, tutti i certificati risultavano non validi nei dispositivi "nuovi". Lo stesso nel mio equivalente in node, le signatures che aggiorno in locale ogni 6 ore risultavano un JSON con un Array vuoto. Forse l'endpoint https://get.dgc.gov.it/v1/dgc/signercertificate/update non restituiva niente ne dava alcun errore. Da qui, almeno nel mio caso, si faceva un controllo su una lista di chiavi vuota e quindi risultava non valido qualsiasi certificato.

francescovgg commented 2 years ago

Si, attualmente è possibile utilizzare solo l'SDK Android, ma ci stiamo muovendo per supportare anche Node e Python. A breve spero di darvi maggiori info.

Buongiorno @astagi, c'è qualche novità su questo argomento? Grazie

astagi commented 2 years ago

Purtroppo ancora nessuna @francescovgg 😞

astagi commented 2 years ago

Temo che dcc-utils non potrà essere un sdk ufficiale... sto lavorando su questo progetto che lo utilizza https://github.com/astagi/verificac19-sdk poi lo passo per l'onboarding (qua i dettagli https://github.com/ministero-salute/it-dgc-verificac19-sdk-onboarding)