3 décembre 2024

Let’s Encrypt, certificats SSL gratuit pour tous !

Tuto révisé en décembre 2022

Article concernant un acteur du web dont vous avez certainement entendu parler et qui met à mal les autorités de certification ancestrales : Let’s Encrypt.

I – Présentation

Fini les certificats auto signés, place maintenant à un joli cadenas vert, à l’absence d’alertes de sécurité, bref, à quelque chose de propre et fonctionnel avec un vrai certificat et qui plus est, gratuit !
En plus d’assurer une certaine sécurité dans vos échanges avec vos serveurs, avoir un certificat SSL améliorera le classement de votre site sur les moteurs de recherche.
Vous allez me dire, y’a forcement un point négatif dans ce truc ?
Et bien, a priori, le seul point négatif, c’est la durée  de validité des certificats, ceux ci étant valide pour trois mois. Mais pas de panique, ils se renouvellent en quelques commandes.
Pour avoir son propre certificat, il existe plusieurs « client ». CertBot, l’officiel de Let’s Encrypt, et bien d’autres (https://letsencrypt.org/docs/client-options/)
Personnellement, mon choix s’est porté sur Acme.sh, écrit en Bash. Simple, efficace, que demander de plus…

 

II – Installation

Pour l’installer, plusieurs solution la aussi (wget, curl, git…). Pour ma part, ce sera Git.
Du coup :

# apt-get install git

Puis, si vous êtes derrière un proxy :

# git config --global http.proxy http://user:pass@ipproxy:portproxy

Installons maintenant acme.sh :

# cd
# mkdir sources
# cd sources/
# git clone https://github.com/Neilpang/acme.sh.git
# cd ./acme.sh
# ./acme.sh --install

Le polisson s’installera alors dans /root/.acme.sh/

On recharge le bash :

# source /root/.bashrc

 

Attention, par défaut, depuis Aout 2021, le CA par défaut de Acme.sh est ZeroSSL.

Après essai, je ne suis pas fan. Des timeouts lors de la création ou le renouvellement des certificats, c’est pas ouf. Et a priori, ils sont coutumiers du fait.

Bref, on configure notre CA sur ce bon vieux Let’s encrypt !

# ./acme.sh --set-default-ca --server letsencrypt

 

 

III – Création de votre certificat.

Il existe ensuite plusieurs façons d’utiliser l’outil.
Dans tous les cas, il est important que votre domaine que vous souhaitez certifier soit bien enregistré dans les DNS.

A – Avec un serveur Web (Nginx, Apache)

Avant tout, assurez vous que votre serveur web est bien configuré (comprendre, le domaine existe dedans, par ex, dans Nginx, un bloc location contient bien server_name toto.debugo.fr ).
Pour ma part, je me sers de cette option sur mon reverse proxy, qui est LE point d’entrée de tout mes sites Webs, quelque soit la VM sur laquelle ils sont hébergés.
Il suffit alors de faire :

# acme.sh --issue -k 4096 -d toto.debugo.fr --nginx --log

Ce qui va nous répondre :

[ven. 09 déc. 2022 19:59:47 CET] Using CA: https://acme.zerossl.com/v2/DV90
[ven. 09 déc. 2022 19:59:47 CET] Single domain='toto.debugo.fr'
[ven. 09 déc. 2022 19:59:47 CET] Getting domain auth token for each domain
[ven. 09 déc. 2022 19:59:57 CET] Getting webroot for domain='toto.debugo.fr'
[ven. 09 déc. 2022 19:59:57 CET] Verifying: toto.debugo.fr
[ven. 09 déc. 2022 19:59:57 CET] Nginx mode for domain:toto.debugo.fr
[ven. 09 déc. 2022 19:59:58 CET] Found conf file: /etc/nginx/sites-enabled/toto
[ven. 09 déc. 2022 19:59:58 CET] Backup /etc/nginx/sites-enabled/tototo /root/.acme.sh/toto.debugo.fr/backup/toto.debugo.fr.nginx.conf
[ven. 09 déc. 2022 19:59:58 CET] Check the nginx conf before setting up.
[ven. 09 déc. 2022 19:59:58 CET] OK, Set up nginx config file
[ven. 09 déc. 2022 19:59:58 CET] nginx conf is done, let's check it again.
[ven. 09 déc. 2022 19:59:58 CET] Reload nginx
[ven. 09 déc. 2022 20:00:03 CET] Processing, The CA is processing your order, please just wait. (1/30)
[ven. 09 déc. 2022 20:00:09 CET] Success
[ven. 09 déc. 2022 20:00:09 CET] Restoring from /root/.acme.sh/toto.debugo.fr/backup/toto.debugo.fr.nginx.conf to /etc/nginx/sites-enabled/toto
[ven. 09 déc. 2022 20:00:09 CET] Reload nginx
[ven. 09 déc. 2022 20:00:09 CET] Verify finished, start to sign.
[ven. 09 déc. 2022 20:00:09 CET] Lets finalize the order.
[ven. 09 déc. 2022 20:00:09 CET] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/QZJbAvBcGbiyOuRaiXtRig/finalize'
[ven. 09 déc. 2022 20:00:13 CET] Order status is processing, lets sleep and retry.
[ven. 09 déc. 2022 20:00:13 CET] Retry after: 15
[ven. 09 déc. 2022 20:00:29 CET] Polling order status: https://acme.zerossl.com/v2/DV90/order/QZJbAvBcGbiyOuRaiXtRig
[ven. 09 déc. 2022 20:00:35 CET] Downloading cert.
[ven. 09 déc. 2022 20:00:35 CET] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/nl7iS-vgfjE5Z_x7RuI3Cg'
[ven. 09 déc. 2022 20:00:40 CET] Cert success.
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
[ven. 09 déc. 2022 20:00:40 CET] Your cert is in: /root/.acme.sh/toto.debugo.fr/toto.debugo.fr.cer
[ven. 09 déc. 2022 20:00:40 CET] Your cert key is in: /root/.acme.sh/toto.debugo.fr/toto.debugo.fr.key
[ven. 09 déc. 2022 20:00:40 CET] The intermediate CA cert is in: /root/.acme.sh/toto.debugo.fr/ca.cer
[ven. 09 déc. 2022 20:00:40 CET] And the full chain certs is there: /root/.acme.sh/toto.debugo.fr/fullchain.cer

En cas de besoin on peut forcer en rajoutant –force (si par ex, la date de renouvellement est loin et que vous avez quand même besoin de le refaire)
Si par la suite, vous souhaitez rajouter un autre domaine au même certificat (comme je disais, par exemple sur un reverse proxy qui gère plusieurs sites, dans quel cas, vous n’aurez alors qu’un seul certificat à gérer)

# acme.sh --issue -k 4096 -d toto.debugo.fr -d toto2.debugo.fr --nginx --log

Puis, quelques semaines plus tard :

# acme.sh --issue -k 4096 -d toto.debugo.fr -d toto2.debugo.fr -d toto3.debugo.fr --nginx --log

Etc, etc..
Et si vous êtes sur Apache, d’une, qu’attendez vous pour migrer vers Nginx, et de deux, en attendant d’effectuer cette migration salvatrice, remplacez –nginx par… –apache, c’est bien, vous suivez !

B – Mode Standalone

Le mode standalone sera utilisé sur un serveur ne disposant pas de serveur Web, par ex, un serveur de messagerie, un ftp…
Tout d’abord, petite dépendance à installer :

# apt-get install socat

Ensuite, il faut savoir que le mode standalone lance son propre serveur web (répondant alors sur le port 80). Plusieurs solutions sont possibles alors…
Soit on route le port 80 vers la machine en question, soit, et c’est mon cas, on se sert de notre Reverse Proxy.
En fait, je rajoute un nouveau server dans /etc/nginx/site-enabled/toto :

server {
     listen 80;
     server_name toto.debugo.fr;
    location / {
        proxy_pass http://IP_SERVEUR/;
    }
}

Où IP_SERVEUR est bien évidement l’IP du serveur ou se trouvera le client acme.sh.
On pense à relancer Nginx :

rev_prox# service nginx restart

Puis, très simplement, sur le serveur ou doit être installé le certificat :

# acme.sh --issue -k 4096 --standalone -d toto.debugo.fr --log

Normalement, tout devrait se faire sans encombre.

C – Autres

Il existe d’autre façons de faire (via DNS notamment… mais celle ci est bien pénible car le renouvellement automatique ne fonctionnera pas. Vous devrez refaire vos enregistrements DNS, etc…).
Je vous invite à lire la documentation de Acme.sh (lien plus bas.) si vous désirez en savoir plus.

 

IV – Installation de votre certificat

Maintenant, il vous faut copier les fichiers générés et les inclure dans vos différents fichiers de configuration. Je vous donne trois exemples : Nginx, Postfix/Dovecot, et ProFTP. En gros, seuls changent les fichiers nécessaires (tous ne le sont pas en fonction des serveurs) et bien évidement, la commande pour redémarrer les serveurs.
Tout d’abord, nous allons créer un répertoire pour stocker nos fichiers :

# cd /etc/ssl/private
# mkdir debugo.fr

A – Nginx

On lance la commande qui va installer les fichiers nécessaires, puis relancer Nginx :

# acme.sh --installcert -d toto.debugo.fr -d toto2.debugo.fr --keypath /etc/ssl/private/debugo.fr/key.pem --fullchainpath /etc/ssl/private/debugo.fr/fullcert.pem --reloadcmd "service nginx force-reload"

Création du « Diffie-Hellman parameter » :

# openssl dhparam -out /etc/ssl/private/debugo.fr/dhparam.pem 4096

Puis dans le fichier /etc/nginx/nginx.conf :

ssl_certificate /etc/ssl/private/debugo.fr/fullcert.pem;
ssl_certificate_key /etc/ssl/private/debugo.fr/key.pem;
ssl_trusted_certificate /etc/ssl/private/debugo.fr/fullcert.pem;
#ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # Score=95
ssl_protocols TLSv1.2; # Score=100
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/private/debugo.fr/dhparam.pem;
ssl_ecdh_curve secp384r1;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=31536000";

Vous remarquerez que j’en profite pour vous donner quelques réglages qui devraient vous permettre d’obtenir un beau A+ sur https://www.ssllabs.com !

B – Postfix et Dovecot

De façon presque similaire :

# acme.sh --installcert -d toto.debugo.fr --cert-file /etc/ssl/private/debugo.fr/cert.pem --key-file /etc/ssl/private/debugo.fr/key.pem --ca-file /etc/ssl/private/debugo.fr/ca.pem --fullchain-file /etc/ssl/private/debugo.fr/fullcert.pem --reloadCmd 'service postfix reload && service dovecot reload'

Ensuite, pour Postfix, dans le fichier /etc/postfix/main.cf :

smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/key.pem
smtpd_tls_cert_file = /etc/postfix/ssl/cert.pem
smtpd_tls_CAfile = /etc/postfix/ssl/fullcert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_tls_session_cache
smtpd_tls_protocols = !SSLv2,!SSLv3

Et pour Dovecot, dans le fichier /etc/dovecot/dovecot.conf :

ssl_protocols = !SSLv2 !SSLv3
ssl_ca = </etc/ssl/private/debugo.fr/ca.pem
ssl_cert = </etc/ssl/private/debugo.fr/cert.pem
ssl_key = </etc/ssl/private/debugo.fr/key.pem
ssl_verify_client_cert = yes
ssl = required

 

C – Proftpd

Toujours le même principe…

# acme.sh --installcert -d toto.debugo.fr --cert-file /etc/ssl/private/debugo.fr/cert.pem --key-file /etc/ssl/private/debugo.fr/key.pem --fullchain-file /etc/ssl/private/debugo.fr/fullcert.pem --reloadCmd 'service proftpd reload'

Et dans le fichier /etc/proftpd/tls.conf, rajoutez donc :

<IfModule mod_tls.c>
 TLSEngine on
 TLSLog /var/log/proftpd/tls.log
 TLSProtocol TLSv1
 TLSRSACertificateFile /etc/ssl/private/debugo.fr/cert.pem
 TLSRSACertificateKeyFile /etc/ssl/private/debugo.fr/key.pem
 TLSCACertificateFile /etc/ssl/private/debugo.fr/fullcert.pem
 TLSRequired on
 TLSOptions NoSessionReuseRequired
</IfModule>

 

V – Renouvellement

Pour le renouvellement, il n’y a normalement rien à faire, une tache cron ayant été rajoutée lors de la génération du certificat.
Mais bon, au cas où :

# acme.sh --renew -d toto.debugo.fr -d toto2.debugo.fr --log --force

Du coup, le certificat sera renouvelé pour 90 jours, les fichiers copiés où il faut (identique à votre premier lancement de acme.sh –installcert) et le(s) service(s) également redémarrés.

 

VI – Ressources

Site Web de Let’s Encrypt : https://letsencrypt.org/
GitHub de Acme.sh : https://github.com/Neilpang/acme.sh/

2 réflexions sur « Let’s Encrypt, certificats SSL gratuit pour tous ! »

  1. Bonjour et merci pour votre tuto. Mais, en suivant votre tuto, j’ai un souci. Après la création du certificat avec la commande : # acme.sh –issue -k 4096 -d toto.debugo.fr –nginx –log , j’ai le message suivant :
    can not find config file for domain monsite.hopto.org
    Si vous pouviez me guider svp, comment faire pour rajouter ce fichier de configuration et à quelle étape faut-il le faire ? Attention, je débute vraiment sous linux.

    1. Bonjour Polo.
      Généralement, ce message indique que le fichier nginx pour ce site n’existe pas.
      Une erreur dans un nom peut être ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *