Aller au contenu
TAAF-OPS --:-- UTC

DNS & SSL Local - bind9 + mkcert

Pas de HTTP, même en local. On habitue les devs à gérer des certificats dès le départ. Cette documentation couvre :

  1. bind9 : Serveur DNS local pour résoudre les domaines *.local
  2. mkcert : Génération de certificats SSL de développement
BesoinSolutionAlternative
Résolution DNS wildcardbind9Fichiers hosts (limité)
Certificats SSL locauxmkcertLet’s Encrypt (impossible en local)
HTTPS en devCA localeIgnorer les warnings (mauvaise pratique)

graph LR
 subgraph NETWORK["Réseau Local"]
 subgraph CLIENTS["Clients DNS"]
 WIN[Windows
DNS Client] WSLC[WSL
DNS Client] end subgraph VM["VM 192.168.56.10"] BIND9[bind9
DNS Server] ZONE["*.domaine.local"] TRAEFIK[Traefik
Reverse Proxy] CONTAINERS[Containers] end end WIN -->|"DNS :53"|BIND9 WSLC -->|"DNS :53"|BIND9 BIND9 --> ZONE ZONE -->|"192.168.56.10"|TRAEFIK TRAEFIK --> CONTAINERS style NETWORK fill:#1a1a2e,stroke:#16213e,color:#fff style CLIENTS fill:#0f3460,stroke:#16213e,color:#fff style VM fill:#533483,stroke:#16213e,color:#fff style BIND9 fill:#e94560,stroke:#16213e,color:#fff style TRAEFIK fill:#00c853,stroke:#16213e,color:#fff
Fenêtre de terminal
# Installation de bind9
sudo apt update
sudo apt install -y bind9 bind9utils bind9-doc
# Vérifier l'installation
named -v
# BIND 9.18.x

Créer le répertoire des zones :

Fenêtre de terminal
sudo mkdir -p /etc/bind/zones

Zone file (/etc/bind/zones/db.domaine.local) :

$TTL 604800
@ IN SOA ns1.domaine.local. admin.domaine.local. (
2024120701 ; Serial (YYYYMMDDNN)
604800 ; Refresh (7 jours)
86400 ; Retry (1 jour)
2419200 ; Expire (28 jours)
604800 ) ; Negative Cache TTL (7 jours)
; Serveurs de noms
@ IN NS ns1.domaine.local.
; Enregistrements A
@ IN A 192.168.56.10
ns1 IN A 192.168.56.10
; Wildcard - TOUS les sous-domaines pointent vers l'IP
* IN A 192.168.56.10

Note : Le wildcard * permet de résoudre automatiquement app.domaine.local, cv.domaine.local, api.domaine.local, etc. sans configuration supplémentaire.

Configuration named (/etc/bind/named.conf.local) :

zone "domaine.local" {
type master;
file "/etc/bind/zones/db.domaine.local";
};

Modifier /etc/bind/named.conf.options :

options {
directory "/var/cache/bind";
// Écouter sur l'IP de la VM et localhost
listen-on { 192.168.56.10; 127.0.0.1; };
listen-on-v6 { none; };
// Autoriser les requêtes depuis n'importe où
allow-query { any; };
// Forwarders pour les domaines externes
forwarders {
8.8.8.8;
8.8.4.4;
};
// Sécurité
dnssec-validation auto;
recursion yes;
};
Fenêtre de terminal
# Vérifier la configuration
sudo named-checkconf
# (pas de sortie = OK)
# Vérifier la zone
sudo named-checkzone domaine.local /etc/bind/zones/db.domaine.local
# zone domaine.local/IN: loaded serial 2024120701
# OK
# Activer et démarrer le service
sudo systemctl enable bind9
sudo systemctl restart bind9
# Vérifier le statut
sudo systemctl status bind9
Fenêtre de terminal
# Test local (dans la VM)
dig @127.0.0.1 domaine.local
dig @127.0.0.1 app.domaine.local
dig @127.0.0.1 nimportequoi.domaine.local
# Tous doivent retourner 192.168.56.10

  1. Ouvrir Paramètres > Réseau et Internet > Modifier les options d’adaptateur
  2. Clic droit sur l’adaptateur réseau actif > Propriétés
  3. Sélectionner Protocole Internet version 4 (TCP/IPv4) > Propriétés
  4. Cocher Utiliser l’adresse de serveur DNS suivante :
ChampValeur
DNS préféré192.168.56.10
DNS auxiliaire8.8.8.8

Vérification :

Fenêtre de terminal
nslookup app.domaine.local
# Server: 192.168.56.10
# Address: 192.168.56.10
# Name: app.domaine.local
# Address: 192.168.56.10

Méthode temporaire :

Fenêtre de terminal
sudo nano /etc/resolv.conf
# Contenu :
nameserver 192.168.56.10
nameserver 8.8.8.8

Méthode persistante :

WSL régénère /etc/resolv.conf à chaque démarrage. Pour persister :

Fenêtre de terminal
# Créer/éditer /etc/wsl.conf
sudo nano /etc/wsl.conf
# Contenu :
[network]
generateResolvConf = false

Puis redémarrer WSL :

Fenêtre de terminal
# PowerShell Windows
wsl --shutdown
wsl

Et recréer /etc/resolv.conf :

Fenêtre de terminal
sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf
# nameserver 192.168.56.10
# nameserver 8.8.8.8

Si vous ne souhaitez pas modifier la configuration DNS système :

Windows (C:\Windows\System32\drivers\etc\hosts) :

192.168.56.10 domaine.local
192.168.56.10 app.domaine.local
192.168.56.10 cv.domaine.local
192.168.56.10 api.domaine.local
192.168.56.10 dokploy.domaine.local

Linux/WSL (/etc/hosts) :

192.168.56.10 domaine.local
192.168.56.10 app.domaine.local
192.168.56.10 cv.domaine.local
192.168.56.10 api.domaine.local
192.168.56.10 dokploy.domaine.local

Limitation : Pas de wildcard possible avec les fichiers hosts. Chaque sous-domaine doit être ajouté manuellement.


WSL/Linux :

Fenêtre de terminal
# Debian/Ubuntu
sudo apt install mkcert
# Ou via Homebrew (si installé)
brew install mkcert

macOS :

Fenêtre de terminal
brew install mkcert

Windows :

Fenêtre de terminal
# Via Chocolatey
choco install mkcert
# Ou télécharger depuis GitHub
# https://github.com/FiloSottile/mkcert/releases
Fenêtre de terminal
# Installer la CA racine dans le système
mkcert -install
# Vérifier l'emplacement de la CA
mkcert -CAROOT
# /home/user/.local/share/mkcert (Linux)
# C:\Users\User\AppData\Local\mkcert (Windows)

Important : Cette commande installe un certificat racine dans le trust store du système. Les certificats générés seront automatiquement reconnus comme valides.

Certificat wildcard pour un domaine :

Fenêtre de terminal
# Créer un dossier pour les certificats
mkdir -p certs
cd certs
# Générer le certificat wildcard
mkcert -key-file key.pem -cert-file cert.pem domaine.local "*.domaine.local"

Output attendu :

Created a new certificate valid for the following names:
- "domaine.local"
- "*.domaine.local"
The certificate is at "cert.pem" and the key at "key.pem"
It will expire on 7 March 2027

Certificat pour plusieurs domaines :

Fenêtre de terminal
mkcert -key-file multi.key -cert-file multi.crt \
localhost \
127.0.0.1 \
::1 \
domaine.local \
"*.domaine.local" \
dev.local \
"*.dev.local"
certs/
├── cert.pem # Certificat public
├── key.pem # Clé privée
└── rootCA.pem # CA racine (optionnel, pour partage)

Copier la CA racine (pour la partager) :

Fenêtre de terminal
cp "$(mkcert -CAROOT)/rootCA.pem" ./certs/

Pour injecter le certificat dans Dokploy, voir : Dokploy - Configuration

Afficher le contenu pour copier/coller :

Fenêtre de terminal
# Certificat
cat certs/cert.pem
# Clé privée
cat certs/key.pem

# Certificats SSL - JAMAIS dans Git
certs/
*.pem
*.key
*.crt
# CA mkcert
rootCA.pem
rootCA-key.pem
ActionRisque si ignoré
Ne pas commiter les certificatsFuite de clés privées
Regénérer régulièrementCertificats expirés
Utiliser des wildcardsMoins de fichiers à gérer
Séparer CA locale de prodConfusion entre environnements

Fenêtre de terminal
# Vérifier les erreurs de configuration
sudo named-checkconf
sudo named-checkzone domaine.local /etc/bind/zones/db.domaine.local
# Voir les logs
sudo journalctl -u bind9 -f
# Erreurs courantes :
# - Oubli du point final après les noms de domaine (ns1.domaine.local.)
# - Permissions incorrectes sur les fichiers de zone
sudo chown bind:bind /etc/bind/zones/*
Fenêtre de terminal
# Vérifier que bind9 écoute sur la bonne IP
sudo ss -tlnp | grep :53
# Vérifier le firewall
sudo ufw status
# Si actif, autoriser DNS
sudo ufw allow 53/udp
sudo ufw allow 53/tcp
# Tester depuis la VM elle-même
dig @127.0.0.1 domaine.local
Fenêtre de terminal
# Réinstaller la CA
mkcert -uninstall
mkcert -install
# Sur Windows, installer manuellement :
# 1. Ouvrir mkcert -CAROOT
# 2. Double-clic sur rootCA.pem
# 3. Installer > Autorités de certification racine de confiance
Fenêtre de terminal
# Vérifier /etc/resolv.conf
cat /etc/resolv.conf
# Si régénéré automatiquement, désactiver
sudo nano /etc/wsl.conf
# [network]
# generateResolvConf = false
# Puis redémarrer WSL
wsl --shutdown

ActionCommande
bind9 : Statussudo systemctl status bind9
bind9 : Restartsudo systemctl restart bind9
bind9 : Check configsudo named-checkconf
bind9 : Check zonesudo named-checkzone domaine.local /etc/bind/zones/db.domaine.local
bind9 : Logssudo journalctl -u bind9 -f
DNS : Testnslookup app.domaine.local 192.168.56.10
mkcert : Install CAmkcert -install
mkcert : Generate certmkcert -key-file key.pem -cert-file cert.pem domain.local "*.domain.local"
mkcert : CA locationmkcert -CAROOT


Voir aussi :


Dernière mise à jour : 2025-12-07