Création de certificats avec le protocole ACME
Cerbot
Avant de déployer le certificat de notre site web, il vous faudra déclarer le certificat racine dans le magasin de certificat de Firefox / Autorités (si vous utilisez Chrome ou Chomium, il vous faudra déclarer le certificat racine dans le magasin de votre système comme vu plus haut).
Il vous faudra également veiller à bien déclarer vos RR sur votre DNS local. Pour ma part, j'ai déclaré "srv-web.maison.lab" et "www.maison.lab" en CNAME sur mon serveur DNS local.
Installez les paquets nécessaires sur le serveur web si ce n'est pas déjà fait.
Créez une page web qui nous servira de test.
server {
listen 80;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name www.maison.lab;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
Nous avons donc le site web local www.maison.lan accessible sur le port 80. Passons à la mise en place du certificat mais juste avant ouvrez une console sur le serveur Step CA et affichez les logs du conteneur (docker logs....).
Puis sur le serveur web, lancez la commande certbot
en précisant l'url de notre serveur CA (https://ca.maison.lab/acme/acme/directory dans mon cas)
root@srv-web:/etc/nginx/sites-available# certbot --nginx --server https://ca.maison.lab/acme/acme/directory
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): <VOTRE_EMAIL>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: www.maison.lab
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for www.maison.lab
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.maison.lab/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.maison.lab/privkey.pem
This certificate expires on 2024-12-08.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for www.maison.lab to /etc/nginx/sites-enabled/www.maison.lab
Congratulations! You have successfully enabled HTTPS on https://www.maison.lab
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bon je dois avouer, c'est déroutant de voir letsencrypt alors que nous interrogeons bien notre serveur Step CA comme vous avez pu le constater dans les logs de Step CA.
Regardons la configuration du VHOST :
root@srv-web:/etc/nginx# cat sites-enabled/www.maison.lab
server {
root /var/www/html;
server_name www.maison.lab;
index index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.maison.lab/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.maison.lab/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.maison.lab) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name www.maison.lab;
return 404; # managed by Certbot
}
Le chiffrement a bien été activé pour notre vhost. Vérifions avec Firefox.
Le cadenas s'affiche proprement.
Les informations du certificat démontre la signature par notre CA.
Comme vous pouvez le constater, le certificat ne durera que 24h. Afin d'éviter de se retrouver avec un certificat invalide, il nous faut procéder à quelques réglages de certbot.
Nous configurons d'abord la tâche CRON de certbot pour s'exécuter toutes les 15 minutes.
root@srv-web:~# vim /etc/cron.d/certbot
(...)
*/15 * * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --no-random-sleep-on-renew
Enfin nous configurons le renouvellement du certificat quand ce dernier est à deux heures de l'expiration.
root@srv-web:~# vim /etc/letsencrypt/renewal/www.maison.lab.conf
# Décommentez la ligne ci-dessous et renseignez le délai voulu
renew_before_expiry = 2 hours
version = 2.1.0
archive_dir = /etc/letsencrypt/archive/www.maison.lab
(...)
Et voilà.
Traefik
Docker
Je pars du principe que Traefik tourne dans un conteneur Docker
1ère étape : Installez le certificat du CA dans le magasin des certificats faisant tourner le conteneur.
2ème étape : Déclarez les variables d'environnement "LEGO_CA..." dans le docker-compose.yml de Traefik.
services:
traefik:
image: "traefik:v3.1"
container_name: traefik
secrets:
- (...)
environment:
- "TZ=Europe/Paris"
- "LEGO_CA_CERTIFICATES=/usr/local/share/ca-certificates/MAISONLAB-CA.crt"
- "LEGO_CA_SYSTEM_CERT_POOL=true"
- (...)
volumes:
# Mapping sur le socket interne de Docker
- '/var/run/docker.sock:/var/run/docker.sock:ro'
(...)
3ème étape : Déclarez le provisionneur ACME dans le fichier de configuration de Traefik. Notez la cohabitation avec Let's Encrypt.
certificatesResolvers:
letsencrypt:
acme:
caServer: "https://acme-v02.api.letsencrypt.org/directory"
email: "<VOTRE_EMAIL>"
storage: "/acme.json"
keyType: EC384
dnsChallenge:
provider: ovh
delayBeforeCheck: 10
resolvers:
- "1.1.1.1:53"
- "8.8.8.8:53"
step-ca:
acme:
caServer: "https://ca.maison.lab/acme/acme/directory"
email: "<VOTRE_EMAIL>"
storage: "/acme.json"
keyType: EC384
certificatesDuration: 24 # en heure
httpChallenge:
entryPoint: web
Proxmox VE
Configuration graphique du protocole ACME
Depuis la dernière mise à jour, il ne semble plus possible de passer par l'option de configuration graphique ACME qui était jusque là accessible dans Datacenter sur la console web. Si vous partez d'une installation récente, cette option n'apparait même plus.
Nous allons donc procéder à la création du compte ACME en ligne de commande. Avant tout, installez le certificat racine de votre CA sur le serveur PVE. Une fois cela fait, procédez à la création du compte ACME.
root@srv-pve01-lab:~# pvenode acme account register MAISONLAB VOTRE_EMAIL --directory https://ca.maison.lab/acme/acme/directory
Attempting to fetch Terms of Service from 'https://ca.maison.lab/acme/acme/directory'..
No Terms of Service found, proceeding.
Attempting to register account with 'https://ca.maison.lab/acme/acme/directory'..
Generating ACME account key..
Registering ACME account..
Registration successful, account URL: 'https://ca.maison.lab/acme/acme/account/ZQhY6841UopMRO9ECpB5nukRUNU21SHd'
Task OK
Vous pouvez retrouver les informations de ce compte dans le dossier /etc/pve/priv/acme/
Connectez-vous maintenant à l'interface de PVE, rendez-vous sur le noeud en question puis sur System > Certificates
Dans la partie ACME, sélectionnez le nom de votre CA (MAISONLAB dans mon cas), ajoutez le domaine (ici srv-pve01-lab.maison.lab) et terminez en cliquant sur "Order Certificates Now".
Et voilà. Rendez-vous maintenant sur votre URL (ex : https://srv-pve01-lab.maison.lab:8006/) et vous devriez obtenir un accès sans message d'erreur sur le certificat.
Conclusion
Step-CA est très utile pour maintenir un niveau de sécurité des communications internes et ce de manière relativement simple et surtout automatique. Je l'utilise dans le cas de services web mais il peut être également utilisé pour du mTLS, du SSH, du VPN, etc. Je ferai une documentation dans le cadre d'une utilisation où une autorité de certification est déjà présente. À noter qu'il existe une alternative : LabCA. C'est une PKI complète intégrant le protocole ACME mais aussi le protole OCSP et a l'avantage de proposer une interface graphique.