On peut lire un peu partout qu’il n’est pas possible d’utiliser Let’s Encrypt sur son réseau privé. Cette assertion est trop rapide. C’est compliqué, pas supporté par défaut, mais amplement faisable.
Une solution consiste à utiliser les fonctions de challenge DNS de Let’s Encrypt et de récupérer et installer en local ces certificats.
Si l’on souhaite cacher l’architecture interne de notre infrastructure (sans la déclarer dans dans un dns public), il suffit simplement d’utiliser un wildcard de sous-domaine.
Le flux d’action, réseau privé / internet, est le suivant:

Pour fonctionner, cette procédure nécessite un serveur DNS public avec une api permettant de mettre à jour vos enregistrement DNS. Vous trouverez de tels services auprès par exemple de DigitalOcean, Namecheap.
Exemple avec un serveur DNS namecheap
dans un répertoire de votre serveur possédant docker (ou directement avec certbot et python), par exemple /data/certs
git clone https://github.com/heralight/certbot_dns_namecheap.git
créer le fichier namecheap.ini dans /data/certs
dans /data/certs/certbot_dns_namecheap
docker-compose run certbot-dns-namecheap certonly \ --non-interactive -a certbot-dns-namecheap:dns-namecheap \ --certbot-dns-namecheap:dns-namecheap-credentials=/namecheap.ini \ --agree-tos \ --email "[email protected]" \ -d *.mondomain.com
les certificats se trouvent dans /data/certs/certbot_dns_namecheap/out/certs/live/mondomain.com/
listes des certificats Let’s Encrypt certbot
docker-compose run certbot-dns-namecheap certificates
renouvellement des certificats Let’s Encrypt certbot
Les certificats Let’s Encrypt ont une durée de validité courte, il vous faut les renouveler périodiquement.
docker-compose run certbot-dns-namecheap renew --force-renewal
dans un crontab ajouter -T en option pour éviter les problèmes. ex: docker-compose run -T …etc
Ensuite, à vous de configurer ou transférer (avec rsync, etcd ou consul par exemple) ces certificats ou bon vous semble.
Exemple – Lier Ingress avec ces certificats
Ci-après, un exemple d’utilisation pour un cluster Kubernetes avec une sur couche Rancher 2. Ingress va automatiquement utiliser vos certificats générés pour vos services exposés sur votre infrastructure.
Première étape, créer le secret contenant les certificats pour ingress.
kubectl -n devops-tools create secret tls tls-rancher-ingress \ --cert=/data/certs/certbot_dns_namecheap/out/certs/live/mondomain.com/cert.pem \ --key=/data/certs/certbot_dns_namecheap/out/certs/live/mondomain.com/privkey.pem
Ensuite automatiser la mise à jour avec crontab.
43 6 * * * cd /data/certs/certbot_dns_namecheap && /usr/local/bin/docker-compose run -T certbot-dns-namecheap renew --post-hook "kubectl -n devops-tools create secret tls tls-rancher-ingress --cert=/data/certs/certbot_dns_namecheap/out/certs/live/mondomain.com/cert.pem --key=/data/certs/certbot_dns_namecheap/out/certs/live/mondomain.com/privkey.pem --dry-run -o yaml | kubectl apply -f - "
En conclusion, pas simple, mais faisable.
Pour information, l’api de Namecheap est disponible uniquement sur demande et sous condition d’avoir beaucoup de leur produit, mais à l’énorme avantage d’être compatible avec des domaines plus exotique, … comme les domaines islandais.
Une réflexion sur « Certificat Let’s Encrypt sur réseau local »