-
Notifications
You must be signed in to change notification settings - Fork 40
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
digital green certificates #10
Conversation
- strips HC1: prefix - parses base45 - inflates ZLIB if necessary - extracts KID, and hcert information from COSE
DGC parsing
…nction spécifique aux codes 2ddoc
Je viens d'implémenter la vérification de la signature du DGC. Chez moi ça marche®. J'ai utilisé les certificats que j'ai récupéré depuis le backend de TAC-Verif, mais il faudrait sûrement développer un outil pour croiser ces certificats depuis différents backends, les mettre à jour régulièrement, détecter les issuers inconnus, etc… Malheureusement, je ne pense pas qu'on puisse récupérer simplement les CSCA de tous les pays pour vérifier la signature des DSC 😢 . |
@gilbsgilbs Excellent! Je pense que dans un premier temps, les certificats de tacverif en statique, c'est suffisant! |
- proper errors for non-authentic certificates - fix bug with "expiresAt" which was set at "issuedAt" value - check CWT expiration and issuance claims - refactor verifications into multiple functions with reduced scope
Il manquait un await devant ton appel à x509certificate.verify(). Je l'ai ajouté, mais il retourne false pour mon certificat, qui est pourtant valide. Est-ce que tu sais pourquoi ? |
J'ai remplacé l'appel à |
Si ça te semble correct, je merge ça. |
Erf 🤦♂️, bien vu, cette fonction ne fait pas ce que je pensais. Elle ne peut pas vérifier la signature puisqu'on ne lui fournit pas les PKs des CSCA (et on ne les a pas toutes malheureusement). Quant à savoir si vérifier l'expiration et la date de début est suffisant, j'imagine que oui. On peut considérer que la révocation et la vérification de la signature sont déjà gérées en mettant à jour régulièrement la liste auprès de diverses sources de confiance (j'ai pu croiser la liste de TAC-Verif avec celle de l'application équivalent autrichienne : greencheck). |
Merci 🙂 |
Bon, merci beaucoup @gilbsgilbs, c'était un chouette weekend, avec un beau résultat à la fin ! N'hésite pas à ouvrir de nouvelles PR pour la suite des améliorations ! |
Voici le script que j'ai utilisé pour récupérer les DSC de l'application autrichienne, si tu veux auditer ou les mettre à jour dans le futur : import json
from base64 import b64decode, b64encode
import cbor2
import requests
resp = requests.get("https://greencheck.gv.at/api/masterdata")
resp.raise_for_status()
trust_list_b64 = resp.json()["trustList"]["trustListContent"]
trust_list_bin = b64decode(trust_list_b64)
trust_list = cbor2.loads(trust_list_bin)
dsc = {
b64encode(c["i"]).decode(): b64encode(c["c"]).decode()
for c in trust_list["c"]
}
print(json.dumps(dsc, sort_keys=True, indent="\t")) Pour TAC-Verif (la recherche du token est laissé en exercice au lecteur) : import base64
import json
import os
import requests
TOKEN = os.environ["TACV_TOKEN"]
ENDPOINT = "https://portail.tacv.myservices-ingroupe.com"
resp = requests.get(
f"{ENDPOINT}/api/client/configuration/synchronisation/tacv",
headers={
"Authorization": f"Bearer {TOKEN}",
},
)
resp.raise_for_status()
result = resp.json()
if os.getenv("2D_DOC") == "true":
print(
json.dumps(
result["certificates2DDoc"],
sort_keys=True,
indent="\t",
),
)
else:
print(
json.dumps(
{
k: base64.b64decode(v).decode()
for k, v in result["certificatesDCC"].items()
},
sort_keys=True,
indent="\t",
),
) |
Du coup les certificats sont en base64(base64(ASN1)) ? 🤣 |
Et oui, ça m'a beaucoup fait rire aussi 😁. J'ai passé un moment à buger dessus je dois dire. |
J'ai commencé le script d'auto-renewal: https://github.com/lovasoa/sanipasse/pull/15/files J'aimerais stocker les certificats déjà parsés en json, ça supprime une dépendance et ça sera plus facile pour un humain de vérifier les diffs. |
Voir la discussion sur #9