Aller au contenu

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).

Magasin des certif Firefox

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.

Installation des paquets
root@srv-web:~# apt install nginx certbot python3-certbot-nginx -y

Créez une page web qui nous servira de test.

Création page web
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)

Création du certificat
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 :

Configuration SSL 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.

cadenas HTTPS

Les informations du certificat démontre la signature par notre CA.

certificat

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.

Configuration de la tâche CRON
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.

Configuration de du délai de renouvellement avant 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.

Extrait 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.

Extrait du fichier de configuration de Traefik
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.

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

Proxmox 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.