Closed dcannova closed 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
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..
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.
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.
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.
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!
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.
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.
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:
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.
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
Grazie mille,.ci siamo chiariti meglio. Dopo andró in debug in modo piú preciso sul mio Green Pass con queste tue considerazioni.
Ecco qui il JSON con i settings delle varie scadenze:
https://get.dgc.gov.it/v1/dgc/settings
Grazie per il prezioso confrontro.
Invece nella parte Node JS.. tutti questi controlli in che parte del codice li trovo? Perchè stavo guardando.. ma mi sfuggono.
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 )
@lucadentella Le regole non sono queste, giusto? Questi sono solo i valori di riferimento? https://get.dgc.gov.it/v1/dgc/settings
esattamente, le regole che utilizzano quei parametri sono attualmente hardcoded (vedi #4 come spiegazione di dettaglio e #17 )
Grazie @lucadentella! Speriamo le espongano presto!
È 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.
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 ?
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?
@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.
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
A me starebbe anche benissimo "buttar via tutto" ed utilizzare l'ipotetico servizio REST citato qui:
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.
@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.. :-)
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.
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.
Ottima notizia!
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
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.
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.
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.
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.
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.
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!
@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 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
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.
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
Purtroppo ancora nessuna @francescovgg 😞
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)
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.