OpenPGP est un format de cryptographie utilisé pour le chiffrement des e-mails de bout en bout.
Le chiffrement avec OpenPGP est géré nativement par Thunderbird, et fonctionne avec n'importe quelle adresse e-mail.
Des services comme Proton vous proposent un usage simplifié en embarquant directement son usage dans leur webmail.
Vous pouvez trouver une liste de logiciels compatibles sur le site OpenPGP.org
Le chiffrement repose sur une paire de clés (publique et privée) associée à chaque adresse e-mail : lorsque vous écrivez à quelqu'un, vous utilisez sa clé publique pour chiffrer le message, le destinataire utilisera sa clé privée pour le déchiffrer et lire son contenu.
S'il est bien sûr possible de partager sa clé publique en la donnant en main propre à ses correspondants, ce n'est pas forcément le plus pratique ; la question se pose ainsi de savoir comment partager sa clé publique par internet de manière sécurisée.
Partager sur un serveur de clés
Historiquement, on partageait ses clés sur un réseau de serveurs de clés décentralisés. Cette approche a trouvé ses limites, et aujourd'hui plusieurs projets OpenPGP se sont rassemblés pour créer et utiliser un serveur de clés principal de confiance : https://keys.openpgp.org/.
Ceci ne vous empêche en rien d'utiliser d'autres serveurs, mais en envoyant vos clés sur celui-là, votre adresse e-mail sera vérifiée (empêchant quiconque de fournir une fausse clé pour votre adresse), et les utilisateurs qui auront ce serveur configuré trouveront votre clé plus facilement.
Pour envoyer votre clé, allez sur la page "gérer votre clé" et entrez votre adresse e-mail. Vous allez recevoir un message avec un lien vous permettant d'envoyer vos clés ou de les supprimer du serveur.
Lorsque la clé est sur un serveur, elle est trouvable par l'API :
https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=blog@lacasa.fr
Il est bien sûr toujours possible d'héberger son propre serveur de clés, et ça peut être pertinent si vous êtes en position d'autorité de confiance pour un grand nombre de clés. C'est par exemple ce qu'a fait Protonmail pour distribuer les clés de tous ses utilisateurs.
Cependant, il faut que les utilisateurs enregistrent manuellement votre serveur de clés dans leurs logiciels pour pouvoir en profiter, vous aurez probablement du mal à convaincre beaucoup de monde de le faire. C'est pour ça que nous avons un autre système de partage de clés : WKD
Partager directement avec Web Key Directory
Plutôt que de passer par un serveur externe en qui il faut avoir confiance, il est possible d'héberger ses propres clés.
L'idée est simple : si une adresse e-mail est en '@lacasa.fr', on doit pouvoir faire confiance au site web https://lacasa.fr
pour fournir sa clé publique.
N'importe quel hébergement statique sera capable de fournir les clés, puisqu'il suffit de créer une arborescence et de donner le bon nom aux fichiers
https://[domaine]/.well-known/openpgpkey/hu/[Hashed-UserId]?l=[UserId]
Le nom du fichier est un hash du userId. Ainsi, pour l'adresse e-mail blog@lacasa.fr
, le hash de blog
est n4jfjtn9wusz7eehybkb96azsdg68ftf
La clé de cette adresse e-mail peut donc être publiée à cette adresse :
https://lacasa.fr/.well-known/openpgpkey/hu/n4jfjtn9wusz7eehybkb96azsdg68ftf?l=blog
Certains serveurs WKD ont besoin d'avoir le userId passé en clair, on l'ajoute donc le paramètre si besoin : l=blog
Il existe un mode avancé pour proposer ses clés, quand pour des raisons pratiques on ne peut pas ou on ne souhaite pas héberger ses clés directement sous le domaine racine.
Ce mode avancé permets aussi de centraliser l'hébergement des clés de plusieurs domaines sur un seul serveur.
Pour ça, il faut créer un sous-domaine openpgpkey
au domaine de l'adresse e-mail, et ajouter aussi un dossier avec le nom du domaine dans le dossier .well-known/openpgpkey
https://openpgpkey.[domaine]/.well-known/openpgpkey/[domaine]/hu/[Hashed-Userid]?l=[UserId]
La clé de mon adresse e-mail est donc aussi accessible à cette adresse :
https://openpgpkey.lacasa.fr/.well-known/openpgpkey/lacasa.fr/hu/n4jfjtn9wusz7eehybkb96azsdg68ftf?l=blog
Ainsi on peut héberger les clés en dehors de son site web principal, et héberger plusieurs domaines sur le même serveur en faisant pointer les différents sous-domaine sur ce site web avec un CNAME.
Le serveur de clés keys.openpgp.org propose ainsi un service WKD utilisable avec votre propre domaine :
Créez le CNAME qui pointe vers wkd.keys.openpgp.org
, et vos clés déjà hébergées sur leur serveur deviennent accessible en WKD sur votre propre domaine.
.NET et les clés OpenPGP
Si je me suis plongé dans le partage de clés OpenPGP, c'était aussi pour pouvoir chiffrer des e-mails envoyés depuis mes applications métier. J'ai donc fait une librairie .NET standard Pericia.OpenPgp pour retrouver facilement des clés sur un serveur de clés ou par WKD, que vous pouvez ensuite utiliser avec BoucyCastle.
var key1 = openPgpSearch.SearchWebKeyDirectory(mailAddress);
var key2 = openPgpSearch.SearchHttpKeyServer(mailAddress);
Cette librairie propose aussi une extension à ASP.NET pour distribuer vos clés via WKD (aussi bien en mode direct qu'en mode avancé). Il vous suffit de mettre vos clés publiques dans un dossier, et elles seront distribuées automatiquement.
// Configure services
var keyDirectory = builder.Environment.ContentRootFileProvider.GetDirectoryContents("Keys");
builder.Services.AddWebKeyDirectory(keyDirectory);
// Configure app
app.UseWebKeyDirectory();