mkcert : des certificats HTTPS valides en local sans aucune configuration

Développer en HTTPS en local est un casse-tête classique : les certificats auto-signés déclenchent des avertissements de sécurité dans le navigateur, et certaines API (Service Workers, cookies Secure, géolocalisation) refusent de fonctionner en HTTP. mkcert règle ce problème en 2 commandes.

Ce que fait mkcert

mkcert crée une autorité de certification locale (CA) sur votre machine et l’installe dans les stores de confiance de votre système (Chrome, Firefox, Safari, système d’exploitation). Il génère ensuite des certificats signés par cette CA — que votre navigateur accepte sans avertissement.

mkcert -install
mkcert localhost 127.0.0.1 mon-site.local

Vous obtenez deux fichiers : localhost+2.pem (certificat) et localhost+2-key.pem (clé privée). Branchez-les sur votre serveur, et HTTPS fonctionne sans message d’erreur.

Installation

# macOS
brew install mkcert
brew install nss  # Pour Firefox

# Linux (Debian/Ubuntu)
sudo apt install libnss3-tools
curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
chmod +x mkcert-v*-linux-amd64
sudo mv mkcert-v*-linux-amd64 /usr/local/bin/mkcert

# Windows (avec Chocolatey)
choco install mkcert

Utilisation

Étape 1 — Installer la CA locale (une seule fois) :

mkcert -install

Cette commande installe votre CA dans Chrome, Firefox, et le keystore système. À faire une seule fois par machine.

Étape 2 — Générer un certificat :

# Pour localhost
mkcert localhost

# Pour plusieurs domaines
mkcert localhost 127.0.0.1 ::1

# Pour un domaine local personnalisé
mkcert mon-site.local api.mon-site.local

Étape 3 — Brancher sur votre serveur :

// Node.js / Express
import https from 'https';
import fs from 'fs';
import app from './app.js';

https.createServer({
  key: fs.readFileSync('localhost-key.pem'),
  cert: fs.readFileSync('localhost.pem'),
}, app).listen(443);
// Vite (vite.config.js)
import fs from 'fs';

export default {
  server: {
    https: {
      key: fs.readFileSync('localhost-key.pem'),
      cert: fs.readFileSync('localhost.pem'),
    },
  },
};

Cas d’usage

  • Service Workers — ne fonctionnent qu’en HTTPS (ou sur localhost)
  • Cookies Secure et SameSite — comportement identique entre dev et prod
  • API de géolocalisation, caméra, micro — exigent HTTPS dans les navigateurs modernes
  • Tester des redirections HTTP → HTTPS — simuler le comportement de production
  • Applications mobiles en dev — pointer un appareil physique vers votre machine avec un vrai HTTPS

+ Les points forts

  • Aucun avertissement navigateur — la CA locale est reconnue nativement par Chrome, Firefox, Safari
  • Zéro configuration réseau — tout se passe en local, pas de compte, pas de service externe
  • Multi-domaines — un seul certificat peut couvrir plusieurs domaines et IP
  • Open source — code auditable, pas de dépendance à un tiers
  • Fonctionne offline — aucune requête externe nécessaire après installation

- Les points faibles

  • Valable uniquement sur votre machine — la CA locale n’est pas reconnue sur d’autres machines. Pour partager avec des collègues, chacun doit installer mkcert
  • Non adapté à la production — les certificats générés ne sont pas reconnus publiquement. Pour la prod, utilisez Let’s Encrypt
  • Pas de renouvellement automatique — les certificats expirent (généralement après 2 ans). Il faut les régénérer manuellement
  • Firefox sur Linux peut nécessiter une config manuelle — selon la version, le store NSS n’est pas toujours détecté automatiquement

En résumé

mkcert est un prérequis discret mais précieux dans tout environnement de développement sérieux. Une installation par machine, et plus jamais de friction HTTPS en local.


Voir aussi :

  • ngrok — exposer un service local sur internet
  • Mailpit — compléter l’environnement de dev avec une boîte mail locale