Vue lecture

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.

mkcert - Un outil génial qui simplifie la mise en place de certificats HTTPS en local

Vous aussi, vous en avez marre de cliquer sur “Continuer vers ce site (non sécurisé)” dans votre navigateur à chaque fois que vous testez votre app en local ? Puis surtout, ça fait peur à tout le monde pendant les démos client…

Alors ça tombe bien car j’ai la solution parfaite pour vous.

Ça s’appelle mkcert et c’est un outil transforme la galère des certificats HTTPS locaux en une simple commande. 2 minutes chrono et vous avez des certificats valides, reconnus par votre navigateur, sans avoir à fouiller dans les tréfonds d’OpenSSL.

Le truc cool avec mkcert, c’est qu’il crée automatiquement une autorité de certification locale sur votre machine. Cette CA est ensuite directement installée dans votre système et reconnue par tous vos navigateurs. Comme ça, plus besoin de jongler avec des certificats auto-signés auxquels personne ne fait confiance. Chrome, Firefox, Safari… tout le monde est content et affiche le petit cadenas vert. Trop chouette non ?

Alors, comment ça marche ? Sur macOS avec Homebrew, moi j’ai fait ça :

brew install mkcert nss
mkcert -install

Et voilà, votre autorité de certification locale est créée et installée. Maintenant, vous voulez un certificat pour votre projet ? Une ligne suffit :

mkcert example.com *.example.com localhost 127.0.0.1

Et vous avez alors vos fichiers .pem prêts à être utilisés avec n’importe quel serveur web. Pas de configuration prise de tête, pas de paramètres chelous, juste ce qu’il faut pour bosser tranquillement. Notez que si besoin, vous pouvez renommer le .pem en .crt et le -key.pem en .key, et ça fonctionnera.

Ce qui est vraiment bien pensé, c’est que mkcert gère tous les cas d’usage du développement moderne. Vous pouvez donc créer des certificats pour des domaines spécifiques, des wildcards pour couvrir tous vos sous-domaines, localhost évidemment, mais aussi des adresses IP. Vous développez une API qui doit être accessible depuis votre téléphone sur le réseau local ? Pas de problème, ajoutez l’IP de votre machine et c’est réglé.

D’ailleurs, pour ceux qui bossent sur Windows, l’installation peut se faire via Chocolatey ou Scoop. Et sous Linux, il faut d’abord installer les outils NSS avec libnss3-tools, puis vous pouvez récupérer les binaires directement depuis les URLs stables comme [https://dl.filippo.io/mkcert/latest?for=linux/amd64](https://dl.filippo.io/mkcert/latest?for=linux/amd64).

Un point super important c’est que mkcert n’est PAS fait pour la production. Le fichier rootCA-key.pem généré contient la clé privée de votre autorité de certification locale donc si quelqu’un met la main dessus, il peut créer des certificats valides pour n’importe quel domaine sur votre machine. Pour la prod, on reste donc sur Let’s Encrypt ou une vraie autorité de certification.

Mais après pour le développement local, c’est juste parfait. Plus besoin de se battre avec les configurations Apache ou Nginx pour faire accepter des certificats bidons. Plus de warnings et surtout, vous pouvez enfin tester correctement toutes les fonctionnalités qui nécessitent HTTPS : service workers, API de géolocalisation, caméra, micro… Tout fonctionne comme en prod.

L’outil supporte même des trucs avancés comme la génération de certificats ECDSA si vous préférez les courbes elliptiques, ou le format PKCS12 pour certaines applications Java. Vous pouvez personnaliser l’emplacement de sortie des certificats, créer des certificats pour l’authentification client…

Bref, malgré que ce soit simple à mettre en place, mkcert couvre en réalité tous les besoins. Je vous recommande donc de tester ça !

Merci à Letsar pour la découverte !

NGINX automatise enfin vos certificats SSL comme un grand

C’est toujours marrant de voir des outils ultra populaires mettre des années à intégrer une fonctionnalité que tout le monde bricole depuis une éternité. Et aujourd’hui, c’est au tour de NGINX qui vient enfin de franchir le pas avec l’intégration native du protocole ACME !

Pour ceux qui ne seraient pas familiers avec cet acronyme, ACME (Automated Certificate Management Environment) c’est le protocole magique qui permet d’automatiser toute la gestion des certificats SSL/TLS. Développé à l’origine par l’Internet Security Research Group pour Let’s Encrypt, c’est donc lui qui vous évite de devoir renouveler manuellement vos certificats tous les 90 jours comme un moine copiste du Moyen Âge.

Le truc vraiment cool, c’est que NGINX a décidé de faire les choses en grand car plutôt que de bricoler une solution rapide, ils ont carrément développé un nouveau module baptisé ngx_http_acme_module qui s’appuie sur leur SDK Rust. Hé oui y’a du Rust dans NGINX ! Cette approche leur permet ainsi d’avoir un module dynamique disponible aussi bien pour la version open source que pour leur solution commerciale NGINX Plus.

Du coup, fini les scripts à la con avec Certbot qui tournent en cron et qui plantent au pire moment. Maintenant, vous configurez tout directement dans votre fichier NGINX comme ceci :

acme_issuer letsencrypt {
 uri https://acme-v02.api.letsencrypt.org/directory;
 state_path /var/cache/nginx/acme-letsencrypt;
 accept_terms_of_service;
}

server {
 listen 443 ssl;
 server_name .example.com;
 acme_certificate letsencrypt;
 ssl_certificate $acme_certificate;
 ssl_certificate_key $acme_certificate_key;
}

Simple, efficace, intégré, plus besoin de jongler entre différents outils, car tout se passe dans la configuration NGINX. Ensuite, les certificats se renouvellent automatiquement, s’installent tout seuls, et vous pouvez enfin dormir tranquille.

Mais attention, selon les discussions sur LWN.net, tout n’est pas rose au pays des bisounours… La communauté a quelques réserves, et pas des moindres. Leur plus gros point de friction c’est que NGINX a décidé de lancer cette première version avec uniquement le support du challenge HTTP-01. Pour les non-initiés, ça veut dire que votre serveur doit être accessible publiquement sur le port 80 pour prouver qu’il contrôle bien le domaine.

Les développeurs frustrés pointent aussi du doigt l’absence du challenge DNS-01. Et je trouve qu’ils ont raison d’être énervés car sans DNS-01, impossible de générer des certificats wildcard (*.example.com), et impossible de sécuriser des services internes qui ne sont pas exposés sur Internet. Donc pour tous ceux qui ont des homelabs ou des infrastructures privées, c’est relou.

Surtout que Caddy, le concurrent direct de NGINX, gère ça depuis des années sans problème. Bref, l’équipe NGINX promet que les challenges TLS-ALPN et DNS-01 arriveront dans le futur, mais pour l’instant, c’est motus et bouche cousue sur les délais.

Pour ceux qui veulent tester, sachez que le code est disponible sur GitHub et des packages précompilés sont déjà disponibles. La documentation officielle explique également bien le processus d’installation et de configuration. Notez que le module utilise une zone de mémoire partagée pour coordonner les renouvellements entre les différents workers NGINX, ce qui est plutôt malin pour éviter les conflits.

Au niveau technique, le workflow est assez classique… vous configurez votre serveur ACME (Let’s Encrypt ou autre), vous allouez la mémoire partagée nécessaire, vous configurez les challenges, et le module s’occupe du reste. Les variables $acme_certificate et $acme_certificate_key sont automatiquement remplies avec les chemins vers vos certificats.

Tout ceci permet de réduire également la surface d’attaque car vous n’avez plus besoin d’avoir Certbot et toutes ses dépendances Python qui traînent sur votre serveur ou plus de scripts externes qui doivent recharger NGINX. Tout est natif, et donc c’est forcément plus sécurisé.

Perso, je trouve que c’est un pas dans la bonne direction, même si l’implémentation actuelle est limitée. Et le faut qu’ils aient codé ça en Rust montre bien que NGINX prend au sérieux la modernisation de sa base de code. Du coup, pour ceux qui ont des besoins simples avec des domaines publics, foncez tester cette nouveauté. Plus d’excuses pour avoir des certificats expirés !

❌