Skip to content
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

Merged
merged 40 commits into from
Jun 27, 2021
Merged

digital green certificates #10

merged 40 commits into from
Jun 27, 2021

Conversation

lovasoa
Copy link
Owner

@lovasoa lovasoa commented Jun 25, 2021

Voir la discussion sur #9

lovasoa and others added 5 commits June 25, 2021 14:34
- strips HC1: prefix
- parses base45
- inflates ZLIB if necessary
- extracts KID, and hcert information from COSE
DGC parsing
@lovasoa
Copy link
Owner Author

lovasoa commented Jun 26, 2021

Le déploiement retourne une erreur liée à bignumber.js:

image

@gilbsgilbs
Copy link
Contributor

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 😢 .

@lovasoa
Copy link
Owner Author

lovasoa commented Jun 26, 2021

@gilbsgilbs Excellent! Je pense que dans un premier temps, les certificats de tacverif en statique, c'est suffisant!

gilbsgilbs and others added 9 commits June 26, 2021 22:12
- 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
@lovasoa
Copy link
Owner Author

lovasoa commented Jun 27, 2021

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 ?

@lovasoa
Copy link
Owner Author

lovasoa commented Jun 27, 2021

J'ai remplacé l'appel à .verify() par une vérification explicite de la date de validité du certificat. Je ne pense pas que l'on veuille re-tester au runtime la signature des certificats auxquels on fait déjà confiance de toute façon.

@lovasoa
Copy link
Owner Author

lovasoa commented Jun 27, 2021

Si ça te semble correct, je merge ça.

@gilbsgilbs
Copy link
Contributor

gilbsgilbs commented Jun 27, 2021

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).

@gilbsgilbs
Copy link
Contributor

Merci 🙂

@lovasoa lovasoa changed the title Début du travail sur les digital green certificates digital green certificates Jun 27, 2021
@lovasoa lovasoa merged commit 5881a82 into master Jun 27, 2021
@lovasoa lovasoa deleted the digital_green_certificate branch June 27, 2021 23:05
@lovasoa
Copy link
Owner Author

lovasoa commented Jun 27, 2021

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 !

@gilbsgilbs
Copy link
Contributor

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",
        ),
    )

@lovasoa
Copy link
Owner Author

lovasoa commented Jun 28, 2021

Du coup les certificats sont en base64(base64(ASN1)) ? 🤣

@gilbsgilbs
Copy link
Contributor

Et oui, ça m'a beaucoup fait rire aussi 😁. J'ai passé un moment à buger dessus je dois dire.

@lovasoa
Copy link
Owner Author

lovasoa commented Jun 28, 2021

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants