Construis ton propre certificat

Trois blocs empilés, chacun imprimant un cachet dans celui du dessus ; le bloc du bas repose sur le sol nu.

Le cadenas à gauche dans ta barre d'adresse dit : tu es bien sur le site qui est écrit, et pas chez quelqu'un qui se fait passer pour lui. Derrière ce cadenas il y a un certificat. Ci-dessous tu en fabriques deux toi-même — avec de vraies clés, de vraies signatures et un vrai contrôle. Tout sera juste. Et pourtant aucun navigateur ne les accepterait, et pas parce qu'il y a une erreur de calcul quelque part.

Les mots dont tu as besoin

Certificat
Une déclaration de la forme « cette clé publique appartient à ce nom », signée par quelqu'un d'autre. À quoi une telle déclaration ressemble pour de vrai est au chapitre 7.2 ; ici tu en construis un toi-même.
Subject et issuer
Les deux noms dans chaque certificat. Subject, c'est de qui il s'agit, issuer, c'est qui l'a signé. Des mots anglais, car c'est littéralement ainsi qu'ils figurent dans les champs.
CA
Certification authority, autorité de certification : une partie qui délivre des certificats pour d'autres. Dans la démo, c'est toi.
Certificat racine
Le certificat tout en haut, qui se signe lui-même. Subject et issuer y sont identiques. « Racine » parce que la chaîne s'y arrête, comme un arbre dans un schéma est à l'envers.
Auto-signé
Signé avec la clé privée qui va avec la clé publique du certificat lui-même. Ça prouve que tu as cette clé, et rien de plus — tu dis seulement à propos de toi-même qu'on peut te faire confiance.
Certificat final
Le certificat au bas de la chaîne, pour un vrai nom : un site web, une personne. Celui de ta banque en est un.
Ancre de confiance (trust anchor)
La clé où tu arrêtes le contrôle parce que tu la crois, tout simplement. Chaque chaîne se termine sur une telle clé. Ce mot est le cœur de ce chapitre.
Empreinte
Le haché d'une clé ou d'un certificat, écrit en hex avec des deux-points. Assez court pour être comparé, et assez unique pour servir de nom.
JSON
Une façon d'écrire des données avec des accolades et "nom": valeur. Tu vas les voir dans le résultat.

Ce que tu vas construire

Deux certificats et une signature entre les deux. C'est la plus petite chaîne qui existe, et elle fonctionne exactement comme la chaîne derrière le cadenas de ta banque — sauf que là il y a le plus souvent trois certificats : le certificat final du site, un certificat intermédiaire, et la racine.

Certificat racineCertificat final
subjectMa propre CA racinele nom que tu tapes
issuerMa propre CA racineMa propre CA racine
paire de clésla sienneune nouvelle paire, à lui
qui appose la signaturela racine, sur elle-mêmela racine, sur le certificat final
ce que ça prouveque quelqu'un a cette clé privéeque la racine relie ce nom à cette clé

La clé privée du certificat final ne quitte jamais son propriétaire. La racine signe une déclaration à propos d'une clé publique, et n'a pas besoin de la clé privée correspondante pour ça. C'est la même séparation qu'au chapitre 6.

Notre certificat est du JSON, un vrai certificat est du DER

La démo écrit un certificat en JSON, parce que tu peux le lire. Un vrai certificat contient le même noyau — numéro de série, subject, issuer, la période de validité, la clé publique — mais il est en DER, une écriture binaire où chaque champ a une place fixe et une longueur fixe. Ces champs et ce qui vient encore s'y ajouter sont au chapitre 7.2.

Pourquoi binaire, et pas simplement du JSON ? Une signature porte sur des octets, pas sur du sens. Ajoute une espace dans le JSON, ou inverse deux champs, et ce sont d'autres octets alors que c'est la même chose qui est écrite : la signature ne correspond plus. La démo résout ça en écrivant toujours exactement les mêmes champs dans exactement le même ordre avant de signer. DER fait la même chose, mais sous forme de convention dont personne ne peut s'écarter. C'est la seule raison pour laquelle un certificat a l'air illisible.

Construis ta propre chaîne

Tout se passe dans ton navigateur. Les clés sont créées ici et ne vont nulle part ; si tu fermes l'onglet, elles ont disparu.

  1. Clique sur Crée un certificat racine. Cherche dans le JSON les champs subject et issuer : le même nom. Ce certificat dit à propos de lui-même qu'il est correct.
  2. Tape un nom — ton prénom, ou un domaine inventé comme sam.be — et clique sur Crée un certificat final. Regarde x et y : ce sont les coordonnées d'un point sur la courbe du chapitre 6.2, et elles sont différentes de celles de la racine. Nouvelle paire de clés.
  3. Clique sur Contrôle la chaîne. La démo sort la clé publique du certificat racine et contrôle avec elle la signature sous le certificat final. Valide.
  4. Clique sur Change une lettre dans le nom. La signature reste, les dates restent, un seul caractère change — et le contrôle repart immédiatement. Invalide. C'est le bouton le plus important de ce chapitre : c'est comme ça que tu sais que personne ne peut modifier un certificat sans la clé privée de l'émetteur.
  5. Clique sur Remets le nom. De nouveau valide, sans que quoi que ce soit ait été resigné.
  6. Clique sur Juge comme un navigateur. Quatre contrôles, trois fois OUI et une fois NON. Lis bien cette quatrième ligne.

Tout est juste, et pourtant personne ne te croit

Ta chaîne est mathématiquement en ordre. Chaque signature est réelle, chaque contrôle réussit, et les clés sont du même type que derrière le cadenas de vrais sites : ECDSA sur la courbe P-256, exactement ce que tu as utilisé toi-même au chapitre 7.1. Mets ça sur un serveur web, et tu récupères quand même un avertissement rouge sur tout ton écran.

La raison est dans cette quatrième ligne du dernier bouton. Ton navigateur contrôle les signatures, remonte la chaîne, et arrive à ta racine. Là, il pose une seule question : cette racine est-elle dans ma liste ? C'est une vraie liste avec de vraies empreintes, livrée avec le navigateur. Firefox utilise celle de Mozilla, avec environ cent cinquante racines dedans ; Chrome, Safari et Windows en ont chacun une, de Google, d'Apple et de Microsoft. Ta racine n'est dans aucune des quatre, puisque tu l'as créée il y a trente secondes.

Il n'y a donc aucune différence mathématique entre ton certificat et celui de ta banque. La différence est que quelqu'un a mis la CA de ta banque sur une liste, et pas toi. Pour y arriver, une CA doit se faire auditer, suivre des règles et faire recontrôler tout ça chaque année.

Ce qu'une vraie CA fait avant de signer

Une CA qui délivre un certificat pour sam.be veut d'abord savoir si tu gères vraiment ce domaine. Le plus souvent, ça se fait automatiquement : mets un certain fichier sur le serveur, ou une certaine ligne dans le DNS du domaine, et la CA va voir s'il y est. Si tu peux faire ça, c'est que tu gères le domaine. Let's Encrypt fait comme ça, gratuitement, et c'est pour ça que presque chaque site a un cadenas aujourd'hui.

Ta racineUne racine de la liste
Signe ce que tu demandes. Ne signe qu'après un contrôle de qui est le demandeur ou de ce qu'il gère.
Existe dans un onglet. Se trouve dans des centaines de millions d'appareils, pendant des années.
Personne ne regarde. Audits annuels, règles publiques, et chaque certificat délivré arrive dans un journal public.
Perdue à la fermeture de ton navigateur. Si la clé privée fuit un jour, la racine doit sortir de toutes les listes — et ça casse d'un coup chaque site en dessous.

Une liste, ça se modifie. Ajoute ta racine à la liste de ton propre portable, et tes propres certificats fonctionnent immédiatement sans avertissement. Les écoles et les entreprises font ça sur leurs appareils, et il y a là une anguille sous roche : qui obtient une racine dans ta liste peut fabriquer un certificat valable pour n'importe quel site et ainsi se placer entre toi et internet sans que le cadenas laisse rien paraître. Vois le chapitre 7.4 pour savoir ce que vaut encore ce cadenas alors.

La même chaîne se trouve dans la puce de ta carte d'identité, mais avec l'État belge comme CA à ta place : en haut une racine de l'État, en dessous un certificat pour ta carte avec ton nom dedans. Ce qu'il y a précisément dessus et comment faire apposer cette signature, tu le fais au chapitre 8.2.

Voici les maths : là où les maths s'arrêtent

Chaque étape de ta chaîne est recalculable. Signature sous le certificat final : contrôlable avec la clé du certificat racine. Signature sous le certificat racine : contrôlable avec sa propre clé. Mais ce dernier contrôle n'ajoute rien — qui a la clé privée peut signer sur lui-même ce qu'il veut. En haut de chaque chaîne il y a une clé que tu ne peux pas recalculer, seulement croire. C'est l'ancre de confiance.

Ce n'est pas une faiblesse dans la conception ; c'est ainsi que les preuves fonctionnent. En mathématiques, tu commences par des axiomes : des énoncés que tu admets, parce qu'il faut bien commencer quelque part. En cryptographie, la discipline qui se penche là-dessus s'appelle la sécurité prouvable, et les théorèmes y ont tous la même forme : si cette hypothèse est juste, alors ce système est sûr. Jamais « ceci est sûr », toujours « si …, alors … ».

L'ancre de confiance est l'axiome d'internet. Sauf qu'ici ce n'est pas un énoncé mathématique mais une organisation, et que la liste des axiomes est gérée par quatre entreprises. C'est là que les maths s'arrêtent et que la convention commence — et il est utile de savoir précisément où passe cette frontière.

Jusqu'ici

C'est le dernier chapitre. Tu as commencé par du texte qui avait l'air d'être de l'écriture secrète et qui ne l'était pas, et tu as ensuite haché toi-même, cassé des mots de passe, chiffré avec AES, convenu d'un secret devant tout le monde, additionné des points sur une courbe, apposé et cassé une signature, envoyé des messages que seul ton ami peut lire, fait signer la puce de ta carte d'identité, et maintenant construit une chaîne de certificats. Rien de tout ça n'était imité : ce sont les mêmes maths qui tournent derrière le cadenas de ta banque.

Ce que tu sais maintenant aussi, c'est là où ces maths s'arrêtent. Le chiffrement fait en sorte que personne ne lise par-dessus ton épaule et que personne ne change quelque chose sans que ça se voie. À qui tu fais confiance de l'autre côté est une décision d'êtres humains. Ce n'est pas un trou dans la technique — c'est l'endroit où tu as encore ton mot à dire.