EXEMPLE — facture fictive d'un domaine fictif (exemple.fr).
Les clés DKIM de origine.json sont des clés de démonstration : le DNS
réel d'exemple.fr ne les publie pas. Les jetons d'horodatage, eux, sont
authentiques (Sectigo).

Message conservé avec AIMailBox
===============================

attestation.pdf   le résumé lisible de tout ce qui suit, à imprimer
message.eml       le message tel qu'il a été reçu, octet pour octet
pieces-jointes/   chaque pièce jointe, extraite du message
empreinte.sha256  les empreintes SHA-256 du message et de ses pièces jointes
horodatage.tsr    le jeton d'une autorité d'horodatage (RFC 3161), s'il existe
origine.json      la signature DKIM du domaine expéditeur et sa clé publique
origine.tsr       le jeton qui date ce relevé
preuve.json       dates, rubrique, autorité et journal de conservation
verifier.py       le vérificateur autonome (Python 3.10+, `pip install "cryptography>=44"`)

Tout vérifier d'un coup :

    python verifier.py .

Ce verifier.py vous a été remis avec la preuve, par la même personne : un
vérificateur joint à un fichier peut avoir été remplacé avec lui. La version
de référence est publiée par AIMailBox ; préférez-la, elle vérifie aussi les
preuves plus anciennes :

    https://aimailbox.cloud/verifier.py

Ou à la main. Le message et ses pièces jointes n'ont pas changé :

    sha256sum -c empreinte.sha256

Ce message existait tel quel à la date du jeton :

    openssl ts -verify -in horodatage.tsr -data message.eml \
        -CAfile /etc/ssl/certs/ca-certificates.crt

(DigiCert et Sectigo sont reconnus par les certificats du système.)

Un certificat racine joint par qui fournit la preuve ne vaut que s'il est
bien celui de l'autorité : pour les commandes à la main, prenez la racine
chez l'autorité ou dans les certificats de votre système, jamais sans la
recouper. verifier.py n'admet que les racines qu'il connaît.

Les pièces jointes sont DANS message.eml : son jeton les couvre. verifier.py
les réextrait du message et contrôle qu'elles sont identiques aux fichiers
de pieces-jointes/.

L'origine (origine.json) : la signature DKIM posée par le domaine expéditeur,
et la clé publique que ce domaine publiait dans son DNS le jour du relevé.
Les domaines changent de clé et retirent les anciennes : sans ce relevé, la
signature deviendrait invérifiable. verifier.py la revérifie hors ligne ;
le jeton origine.tsr prouve que la clé a été relevée à cette date :

    openssl ts -verify -in origine.tsr -data origine.json -CAfile /etc/ssl/certs/ca-certificates.crt

L'autorité n'a reçu que des empreintes : jamais le contenu du message.
