Verifica Green Pass API

ciao!

quella lista contiene i KID dei certificati firmatari (non dei singoli green pass) non più validi.
Quello che l’app ufficiale fa è:

  • recupera dall’endpoint /update tutti i certificati (iterando per l’header x-resume-token) memorizzando per ogni certificato anche il suo KID (presente nell’header x-kid)
  • verifica se tale KID è presente nell’elenco disponibile all’endpoint /status, in tal caso lo considera invalido e non lo aggiunge all’elenco di certificati che poi utilizza per validare le firme dei green pass

Per riferimento guarda il metodo fetchCertificates() qui.

Ok ora è tutto più chiaro grazie!

Buonasera a tutti
vorrei sapere come trattare la stringa signature che è un array in javascript che è il risultato della decodifica del green pass. Nessun problema per i dati.

const results = cbor.decodeAllSync(output);
[headers1, headers2, cbor_data, signature] = results;

qualcuno è riuscito a validare la firma?

io come chiavi di firme ho trovato questo che risulta sempre aggiornato ed è francese.

https://raw.githubusercontent.com/lovasoa/sanipasse/master/src/assets/Digital_Green_Certificate_Signing_Keys.json

grazie in anticipo

1 Mi Piace

Ciao! se guardi più su in questo thread, ci sono molti esempi inclusa la libreria presentata dal ministero della salute dcc-utils.

Buongiorno a tutti. Ho un quesito in merito al salvataggio dei dati del green pass.
Da quel che ho capito leggendo l’allegato B, la verifica del QR code va fatta esclusivamente in modalità offline e senza salvare dati personali.
Io parto da una situazione in cui dispongo già dei dati dell’utente (un’app con una anagrafica).
Non sono riuscito a trovare riscontro sulla possibilità di salvare esclusivamente la data di validità del green pass e l’id.
La data di validità verrebbe usata per dare accesso all’utente senza necessità di ripetere ogni giorno la scansione del QR Code.
L’id servirebbe per effettuare un controllo giornaliero confrontandolo con la lista dei revocati.

A vostro avviso ci sono problemi/falle in questo approccio?
Grazie in anticipo

Grazie​:+1::+1:

Chi conosce un url ufficiale per scaricare tutte le chiavi per la verifica della firma dei certificati?
Grazie

Secondo me è plausibile in quanto non stai salvando dati personali in senso stretto.

Ciao,

Si, penso ci sia un errore, non esiste una data di validità del GreenPass. Il QR code contiene solo dati oggettivi. Tipo di GP, eventuale date di vaccinazione etc.

L’URL “ufficiale” utilizzata dall’app è questa:
https://get.dgc.gov.it/v1/dgc/signercertificate/update

non li ottieni con una singola chiamata, ma iterando in base al valore del token x-resume-token (più in alto in questo thread c’è il link ad una issue github della libreria dcc-utils dove viene mostrato un esempio su come fare)

vedo un qualche problema: in primis se dovesse essere invalidato a posteriori il certificato che ha firmato un green pass, non te ne accorgeresti più. A meno che quando parli di salvarti l’ID, intendi il KID del certificato firmatario.

Inoltre come scrive Ettore il certificato non ha una data di validità ma la sua validità è generata dall’applicazione delle regole che ogni stato applica (es. 42gg dopo la prima vaccinazione se il vaccino è Pfizer). I parametri delle regole sono periodicamente aggiornati (es. quando vorranno passare ad un anno di validità) quindi comunque dovresti salvarti i dati del green pass e ogni volta ri-validarli in base ai parametri che scarichi dal sito ufficiale.

Grazie per la precisazione @ettoremazza, effettivamente hai ragione. C’è una data di scadenza del QR-code, ma non ha nulla a che vedere con la data di validità del GP.
La data di validità va quindi calcolata in base alle regole definite al paragrafo 3 dell’allegato B?
Nel testo viene citata anche una “Sezione 0” che però non riesco a trovare.
@LucaD si, intendo il KID, per verificare se è stato revocato.
Effettivamente è un approccio piuttosto complesso, se ho capito bene dovrei salvarmi tutti i dati del certificato per avere la certezza di convalidarlo nel modo corretto.
A questo punto però mi chiedo una cosa: app come Stocard o Google Play (ma anche molte altre) permettono di salvare il proprio certificato GP sul telefono (ma anche GP di altre persone, addirittura).
Impostando una appropriata comunicazione per l’utente sulla modalità di gestione dei suoi dati (con accettazione esplicita), è possibile procedere in questo senso?

non sono espertissimo di privacy, ma recentemente il garante si è espresso su un tema simile (palestre che conservavano il GP dei clienti) dando parere negativo:

In questo caso sarà interessante capire come verrà sviluppata la “piattaforma per i presidi”, che dovrebbe in qualche modo automatizzare i controlli.
Grazie Luca.

non ho trovato lo schema di decreto che descrive la soluzione, ma dal parere (positivo) espresso dal garante:

si evince che sarà una integrazione “b2b” tra il sistema DGC e il sistema informatico delle scuole (SiDi). Tale integrazione consentirà alle segreterie di avere (in maniera automatica e su base giornaliera) l’informazione circa il possesso o meno di un GP valido da parte del personale scolastico in servizio.

Il Garante mette molto risalto sul fatto che tale informazione dovrà essere booleana, senza dare alcuna indicazione sulla modalità (vaccinazione, tampone…) con cui la persona ha ottenuto il proprio GP.

credo che la validazione della firma si ottiene ricalcolando l’hash dei campi e vedere se coincide con la firma sottoposta a chiave pubblica. Si potrebbe fare a mano il confronto? Quale funzione di hash viene usata e su che campi? stavo cercando queste info, se qualcuno lo sa, grz

1 Mi Piace

Ciao

la sicurezza è gestita tramite il protocollo COSE:
https://datatracker.ietf.org/doc/html/rfc8152

Se vuoi vedere come operano le librerie puoi dare un’occhiata a quella Python (che ha anche una buona spiegazione generale):
https://pycose.readthedocs.io/en/latest/

o a quella JS usata anche da dcc-utils:

ok grazie guardo subito

Perdonami, ma perché devi “salvare” i dati?
La convalida la devi fare ogni volta a parer mio, perché per qualsiasi ragione, un green pass potrebbe essere invalidato , (signatures, rules e via dicendo)
A mio avviso quello che stai cercando di fare non può funzionare e rischia di validarti greenpass scaduti.
Ricorda, che a prescindere, la validazione legale la hai solo con Verifica C-19.
Per quanto riguarda il salvataggio, secondo me se uno si salva, nome cognome e al limite un codice greenpass magari cryptato, non dovrebbe avere particolari problemi.
Alla fine non stai salvando il greenpass, ne dati sensibili, poiché da soli questi dati non servono a niente.
Secondo me, non puoi salvarti dati riguardanti lo stato di salute, cioè che tipo di vaccinazione, che numero e via dicendo. Però magari ho interpretato male la cosa.
Alla fine se ti salvi nome cognome e il CI non ti stai salvando assolutamente il greenpass ne facendo una copia.

Una descrizione breve ma completa del meccanismo, in inglese, scritta dall’autore di CWT con programmi di esempio: Verifying EU Digital COVID-19 Certificate with Python CWT .

La parte più complessa è l’aggiornamento delle chiavi. Qui il programma di esempio ha bisogno di un paio di modifiche:

--- python_cwt_sample_eudcc_02 originale.py 	2021-09-09 17:43:28.453407633 +0200
+++ python_cwt_sample_eudcc_02. modificato.py 	2021-09-09 17:46:48.901634855 +0200
@@ -35,7 +35,7 @@
             if x_resume_token:
                 headers = {"X-RESUME-TOKEN": x_resume_token}
             r = requests.get(
-                self._base_url + "/signercertificateUpdate", headers=headers
+                self._base_url + "/signercertificate/update", headers=headers
             )
             status = r.status_code
             if status == 204:
@@ -53,7 +53,7 @@
             )
 
         # Filter expired/revoked DSCs
-        r = requests.get(self._base_url + "/signercertificateStatus")
+        r = requests.get(self._base_url + "/signercertificate/status")
         if r.status_code != 200:
             raise Exception("Received %d from signercertificateStatus" % r.status_code)
         active_kids = r.json()
@@ -93,10 +93,10 @@
 
 # An endpoint of Digital Green Certificate Verifier Service compliant with:
 # https://eu-digital-green-certificates.github.io/dgca-verifier-service/
-BASE_URL = os.environ["CWT_SAMPLES_EUDCC_BASE_URL"]
+BASE_URL = 'https://get.dgc.gov.it/v1/dgc'
 
 # e.g., "./dscs.json"
-TRUSTLIST_STORE_PATH = os.environ["CWT_SAMPLES_EUDCC_TRUSTLIST_STORE_PATH"]
+TRUSTLIST_STORE_PATH = './dscs.json'
 
 # quoted from https://github.com/eu-digital-green-certificates/dgc-testdata/blob/main/AT/2DCode/raw/1.json
 BASE45_FORMATTED_EUDCC = b"HC1:NCFOXN%TS3DH3ZSUZK+.V0ETD%65NL-AH-R6IOOK.IR9B+9G4G50PHZF0AT4V22F/8X*G3M9JUPY0BX/KR96R/S09T./0LWTKD33236J3TA3M*4VV2 73-E3GG396B-43O058YIB73A*G3W19UEBY5:PI0EGSP4*2DN43U*0CEBQ/GXQFY73CIBC:G 7376BXBJBAJ UNFMJCRN0H3PQN*E33H3OA70M3FMJIJN523.K5QZ4A+2XEN QT QTHC31M3+E32R44$28A9H0D3ZCL4JMYAZ+S-A5$XKX6T2YC 35H/ITX8GL2-LH/CJTK96L6SR9MU9RFGJA6Q3QR$P2OIC0JVLA8J3ET3:H3A+2+33U SAAUOT3TPTO4UBZIC0JKQTL*QDKBO.AI9BVYTOCFOPS4IJCOT0$89NT2V457U8+9W2KQ-7LF9-DF07U$B97JJ1D7WKP/HLIJL8JF8JFHJP7NVDEBU1J*Z222E.GJ457661CFFTWM-8P2IUE7K*SSW613:9/:TT5IYQBTBU16R4I1A/9VRPJ-TS.7ZEM7MSVOCD4RG2L-TQJROXL2J:52J7F0Q10SMAP3CG3KHF0DWIH"

E di una BASE45_FORMATTED_EUDCC italiana? (Con la mia funziona.)

Modifica: Sembra che la correzione sia solo italiana, secondo specifiche:
https://eu-digital-green-certificates.github.io/dgca-verifier-service/

Buongiorno,
è stato già detto e stra-detto (basta leggere qualche post più in su) che non è possibile codificare un GP valido partendo dai dati della persona.
La domanda non è molto chiara comunque