Ubuntu 18.04 LTS – Installation de certificats SSL/TLS avec Certbot (Let’s Encrypt)
Let’s Encrypt est une autorité de certification libre, automatisée et ouverte qui fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé (via l’outil certbot) destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. En mai 2018, Let’s Encrypt a livré plus 70 millions de certificats SSL/TLS.
1 – Installation
Mettez à jour votre gestionnaire de paquets, ajoutez le repository officiel de Let’s Encrypt et installez le paquet certbot :
$ sudo apt-get update $ sudo apt-get install software-properties-common $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt-get update $ sudo apt-get install certbot
2 – Génération des certificats
Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins Apache et Nginx entièrement automatisés qui mettent à jour la configuration des virtual hosts.
Le plugin standalone nécessite d’écouter sur les ports 80 ou 443 pour effectuer une validation de votre certificat.
Il est donc nécessaire d’arrêter votre serveur Apache ou Nginx.
- Partons du principe que vous disposez du virtual host suivant écoutant sur le port 80 :
Pour Nginx :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } }
Pour Apache :
<VirtualHost *:80> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html </VirtualHost>
- Arrêtez votre serveur Apache ou Nginx :
$ sudo systemctl stop nginx
ou
$ sudo systemctl stop apache
- Vérifiez que le port 80 n’est pas utilisé :
$ netstat -na | grep ':80.*LISTEN'
Si cette commande n’affiche rien sur la sortie standard, alors le port 80 n’est pas utilisé.
- Générez votre certificat en remplaçant mondomaine.com et www.mondomaine.com par vos informations :
$ sudo certbot certonly --standalone --agree-tos --no-eff-email -d mondomaine.com -d www.mondomaine.com --rsa-key-size 4096
Sachez qu’il est possible de spécifier une option lors de la génération de votre certificat permettant de forcer Let’s Encrypt de valider votre domaine sur un port en particulier :
- –preferred-challenges http pour utiliser le port 80
- –preferred-challenges tls-sni pour utiliser le port 443.
Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
- cert.pem : le certificat de votre domaine mondomaine.com
- chain.pem : le certificat Let’s Encrypt
- fullchain.pem : les certificats cert.pem et chain.pem combinés
- privkey.pem : la clé privée du certificat.
- Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :
Pour Nginx :
server { listen 80; listen [::]:80; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.com/chain.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE- RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:4m; ssl_session_timeout 1440m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4; add_header Strict-Transport-Security max-age=31536000; }
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- server_name : votre nom de domaine
- root : répertoire racine de vos ressources web
- ssl_certificate : chemin vers votre fullchain.pem
- ssl_certificate_key : chemin vers votre privkey.pem
- ssl_trusted_certificat : chemin vers votre chain.pem.
Pour Apache :
<IfModule mod_ssl.c> <VirtualHost *:80> ServerName mondomaine.com Redirect / https://mondomaine.com </VirtualHost> <VirtualHost *:443> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html SSLCertificateFile /etc/letsencrypt/live/mondomaine.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/mondomaine.com/chain.pem SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire </VirtualHost> </IfModule>
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- ServerName, Redirect et ServerAlias : votre nom de domaine
- ServerAdmin : votre email
- DocumentRoot : répertoire racine de vos ressources web
- SSLCertificateFile : chemin vers votre cert.pem
- SSLCertificateKeyFile : chemin vers votre privkey.pem
- SSLCertificateChainFile : chemin vers votre chain.pem.
- Démarrez votre serveur Apache ou Nginx :
$ sudo systemctl start nginx
ou
$ sudo systemctl start apache
- Rendez-vous sur SSL Labs et testez la sécurité de votre configuration SSL/TLS !
Le plugin webroot crée un fichier temporaire ${webroot-path}/.well-known/acme-challenge dans le dossier racine de vos ressources web, celui-ci permettra aux serveurs de Let’s Encrypt de valider votre certificat en appelant ce fichier temporaire.
- Partons du principe que vous disposez du virtual host suivant écoutant sur le port 80 :
Pour Nginx :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } }
Pour Apache :
<VirtualHost *:80> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html </VirtualHost>
- Générez votre certificat en remplaçant /var/www/html et mondomaine.com par vos informations :
$ sudo certbot certonly --webroot -w /var/www/html --agree-tos --no-eff-email -d mondomaine.com -d www.mondomaine.com --rsa-key-size 4096
Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
- cert.pem : le certificat de votre domaine mondomaine.com
- chain.pem : le certificat Let’s Encrypt
- fullchain.pem : les certificats cert.pem et chain.pem combinés
- privkey.pem : la clé privée du certificat.
- Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :
Pour Nginx :
server { listen 80; listen [::]:80; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.com/chain.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE- RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:4m; ssl_session_timeout 1440m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4; add_header Strict-Transport-Security max-age=31536000; }
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- server_name : votre nom de domaine
- root : répertoire racine de vos ressources web
- ssl_certificate : chemin vers votre fullchain.pem
- ssl_certificate_key : chemin vers votre privkey.pem
- ssl_trusted_certificat : chemin vers votre chain.pem
Pour Apache :
<IfModule mod_ssl.c> <VirtualHost *:80> ServerName mondomaine.com Redirect / https://mondomaine.com </VirtualHost> <VirtualHost *:443> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html SSLCertificateFile /etc/letsencrypt/live/mondomaine.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/mondomaine.com/chain.pem SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire </VirtualHost> </IfModule>
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- ServerName, Redirect et ServerAlias : votre nom de domaine
- ServerAdmin : votre email
- DocumentRoot : répertoire racine de vos ressources web
- SSLCertificateFile : chemin vers votre cert.pem
- SSLCertificateKeyFile : chemin vers votre privkey.pem
- SSLCertificateChainFile : chemin vers votre chain.pem.
- Redémarrez votre serveur Apache ou Nginx :
$ sudo systemctl restart nginx
ou
$ sudo systemctl restart apache
- Créez un répertoire spécifique à la validation de Let’s Encrypt (remplacez par votre domaine) :
$ sudo mkdir -p /var/www/letsencrypt/mondomaine.com $ sudo chown -R www-data:www-data /var/www/letsencrypt
- Ajoutez les lignes suivantes dans votre configuration Nginx ou Apache en modifiant la valeur des directives root pour Nginx et DocumentRoot et Directory pour Apache en fonction du répertoire que vous avez créé précédemment :
Pour Nginx :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location ~ /.well-known { root /var/www/letsencrypt/mondomaine.com } location / { proxy_pass http://127.0.0.1:12345; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Pour Apache :
<VirtualHost *:80> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/letsencrypt/mondomaine.com
Options Indexes FollowSymLinks AllowOverride None Require all granted ProxyPreserveHost On ProxyRequests off ProxyPass /.well-known/acme-challenge/ ! ProxyPass / http://127.0.0.1:12345/ ProxyPassReverse / http://127.0.0.1:12345 </VirtualHost> - Redémarrez votre serveur Apache ou Nginx :
$ sudo systemctl restart nginx
ou
$ sudo systemctl restart apache
- Générez votre certificat en remplaçant /var/www/letsencrypt/mondomaine.com et mondomaine.com par vos informations :
$ sudo certbot certonly --webroot -w /var/www/letsencrypt/mondomaine.com --agree-tos --no-eff-email -d mondomaine.com -d www.mondomaine.com --rsa-key-size 4096
Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
- cert.pem : le certificat de votre domaine mondomaine.com
- chain.pem : le certificat Let’s Encrypt
- fullchain.pem : les certificats cert.pem et chain.pem combinés
- privkey.pem : la clé privée du certificat.
- Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :
Pour Nginx :
server { listen 80; listen [::]:80; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name mondomaine.com www.mondomaine.com; location ~ /.well-known { root /var/www/letsencrypt/mondomaine.com; } location / { proxy_pass http://127.0.0.1:12345; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.com/chain.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE- RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:4m; ssl_session_timeout 1440m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4; add_header Strict-Transport-Security max-age=31536000; }
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- server_name : votre nom de domaine
- root : répertoire spécifique à la validation de Let’s Encrypt
- proxy_pass : IP de votre serveur tiers
- ssl_certificate : chemin vers votre fullchain.pem
- ssl_certificate_key : chemin vers votre privkey.pem
- ssl_trusted_certificat : chemin vers votre chain.pem.
Pour Apache :
<IfModule mod_ssl.c> <VirtualHost *:80> ServerName mondomaine.com Redirect / https://mondomaine.com </VirtualHost> <VirtualHost *:443> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/letsencrypt/mondomaine.com
Options Indexes FollowSymLinks AllowOverride None Require all granted ProxyPreserveHost On ProxyRequests off ProxyPass /.well-known/acme-challenge/ ! ProxyPass / http://127.0.0.1:12345/ ProxyPassReverse / http://127.0.0.1:12345 SSLCertificateFile /etc/letsencrypt/live/mondomaine.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/mondomaine.com/chain.pem SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire </VirtualHost> </IfModule> Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- ServerName, ServerAlias et Redirect : votre nom de domaine
- ServerAdmin : votre email
- DocumentRoot et Directory : répertoire spécifique à la validation de Let’s Encrypt
- ProxyPass et ProxyPassReverse : IP de votre serveur tiers
- SSLCertificateFile : chemin vers votre cert.pem
- SSLCertificateKeyFile : chemin vers votre privkey.pem
- SSLCertificateChainFile : chemin vers votre chain.pem.
Le plugin manual permet de générer un certificat en effectuant la validation du domaine vous-même. Ce plugin permet ainsi de générer des certificats sur un serveur différent de celui où se trouve votre serveur web et sans avoir les droits du super-utilisateur.
- Partons du principe que vous disposez du virtual host suivant écoutant sur le port 80 :
Pour Nginx :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } }
Pour Apache :
<VirtualHost *:80> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html </VirtualHost>
- Générez votre certificat en remplaçant mondomaine.com et www.mondomaine.com par vos informations :
$ sudo certbot certonly --manual --agree-tos --no-eff-email -d mondomaine.com -d www.mondomaine.com --rsa-key-size 4096
- Il vous sera demandé d’accepter que votre IP soit dans les bases de données de Let’s Encrypt :
NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged? ------------------------------------------------------------------------------- (Y)es/(N)o: Y
- Afin de prouver à Let’s Encrypt que vous ayez bien la main sur votre serveur web, il vous sera demandé de créer un fichier dans le répertoire de vos ressources web et d’y inclure une clé permettant à Let’s Encrypt de valider votre certificat :
------------------------------------------------------------------------------- Create a file containing just this data: nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk.VztX9LSnV1bIEFCVa8uRVuXfntRLl5IJKZz6LRwzX8Q And make it available on your web server at this URL: http://www.mondomaine.com/.well-known/acme-challenge/nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk ------------------------------------------------------------------------------- Press Enter to Continue
- Pour cela, ouvrez un nouveau terminal et créez le répertoire .well-known/acme-challenge en remplaçant /var/www/html/ par le répertoire racine de vos ressources web :
$ sudo mkdir -p /var/www/html/.well-known/acme-challenge
- Créez le fichier secret de validation dans le répertoire précédemment créé en remplaçant la clé nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk.VztX9LSnV1bIEFCVa8uRVuXfntRLl5IJKZz6LRwzX8Q par votre propre clé générée par Let’s Encrypt ainsi que le nom du fichier nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk :
$ sudo bash -c 'printf "%s" nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk.VztX9LSnV1bIEFCVa8uRVuXfntRLl5IJKZz6LRwzX8Q > /var/www/html/.well-known/acme-challenge/nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk'
- Fermez ce deuxième terminal, revenez sous votre premier terminal et appuyez sur la touche « Entrée ».
- Let’s Encrypt génèrera automatiquement 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
- cert.pem : le certificat de votre domaine mondomaine.com
- chain.pem : le certificat Let’s Encrypt
- fullchain.pem : les certificats cert.pem et chain.pem combinés
- privkey.pem : la clé privée du certificat.
- Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :
Pour Nginx :
server { listen 80; listen [::]:80; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.com/chain.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE- RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:4m; ssl_session_timeout 1440m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4; add_header Strict-Transport-Security max-age=31536000; }
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- server_name : votre nom de domaine
- root : répertoire racine de vos ressources web
- ssl_certificate : chemin vers votre fullchain.pem
- ssl_certificate_key : chemin vers votre privkey.pem
- ssl_trusted_certificat : chemin vers votre chain.pem.
Pour Apache :
<IfModule mod_ssl.c> <VirtualHost *:80> ServerName mondomaine.com Redirect / https://mondomaine.com </VirtualHost> <VirtualHost *:443> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html SSLCertificateFile /etc/letsencrypt/live/mondomaine.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/mondomaine.com/chain.pem SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire </VirtualHost> </IfModule>
Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :
- ServerName, Redirect et ServerAlias : votre nom de domaine
- ServerAdmin : votre email
- DocumentRoot : répertoire racine de vos ressources web
- SSLCertificateFile : chemin vers votre cert.pem
- SSLCertificateKeyFile : chemin vers votre privkey.pem
- SSLCertificateChainFile : chemin vers votre chain.pem.
- Redémarrez votre serveur Apache ou Nginx :
$ sudo systemctl restart nginx
ou
$ sudo systemctl restart apache
Si vous utilisez Apache comme serveur web, le plugin apache permet de générer et d’installer automatiquement des certificats en modifiant directement votre virtual host.
- Le plugin apache n’est pas intégré par défaut à certbot. vous devez tout d’abord l’installer :
$ sudo apt-get install -y python-certbot-apache
- Partons du principe que vous disposiez déjà du virtual host suivant écoutant sur le port 80 :
<VirtualHost *:80> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html </VirtualHost>
- Vous devez activer le module ssl :
$ sudo a2enmod ssl
- Redémarrez votre serveur Apache :
$ sudo systemctl restart apache
- Générez votre certificat en remplaçant mondomaine.com et www.mondomaine.com par vos informations :
$ sudo certbot --apache -d mondomaine.com -d www.mondomaine.com --rsa-key-size 4096 --agree-tos --no-eff-email
- Il vous sera demandé si vous souhaitez laisser l’accès à la fois HTTP et HTTPS ou forcer toutes les requêtes en HTTPS :
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
La configuration est terminée ! Rendez-vous désormais sur votre site désormais en HTTPS !
Sachez simplement qu’en arrière plan, Let’s Encrypt a généré un nouveau virtual host mondomaine-le-ssl.conf où l’emplacement de vos certificats et de votre clé privée est spécifié. Il inclut aussi un fichier options-ssl-apache.conf qui permet de configurer SSL pour Apache (l’algorithme de chiffrage, le type de clé supportée, etc.) :
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html SSLCertificateFile /etc/letsencrypt/live/mondomaine.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/mondomaine.com/chain.pem </VirtualHost> </IfModule>
Si la configuration proposée par défaut ne vous convient pas, vous pouvez évidemment modifier le virtual host.
Enfin si vous avez choisi la 2ème option (à savoir forcer toutes les requêtes en HTTPS), en plus d’avoir généré un nouveau virtual host mondomaine-le-ssl.conf comme pour l’option 1, Let’s Encrypt aura automatiquement modifié votre virtual host pour rediriger toutes les requêtes HTTP vers HTTPS :
<VirtualHost *:80> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin email@mondomaine.com DocumentRoot /var/www/html RewriteEngine on RewriteCond %{SERVER_NAME} =mondomaine.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
Let’s Encrypt aura généré automatiquement 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
- cert.pem : le certificat de votre domaine mondomaine.com
- chain.pem : le certificat Let’s Encrypt
- fullchain.pem : les certificats cert.pem et chain.pem combinés
- privkey.pem : la clé privée du certificat.
Si vous utilisez Nginx comme serveur web, le plugin nginx permet de générer et d’installer automatiquement des certificats en modifiant directement votre virtual host.
- Le plugin nginx n’est pas intégré par défaut à certbot. vous devez tout d’abord l’installer :
$ sudo apt-get install -y python-certbot-nginx
- Partons du principe que vous disposiez déjà du virtual host suivant :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } }
- Générez votre certificat en remplaçant /var/www/html, mondomaine.com et www.mondomaine.com par vos informations :
$ sudo certbot --nginx -d mondomaine.com -d www.mondomaine.com --rsa-key-size 4096 --agree-tos --no-eff-email
- Il vous sera demandé si vous souhaitez laisser l’accès à la fois HTTP et HTTPS ou forcer toutes les requêtes en HTTPS :
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
La configuration est terminée ! Rendez-vous désormais sur votre site désormais en HTTPS !
Sachez simplement qu’en arrière plan, Let’s Encrypt a modifié votre virtual host où l’emplacement de vos certificats et de votre clé privée a été spécifié. Il inclut aussi un fichier /etc/letsencrypt/options-ssl-nginx.conf qui permet de configurer SSL pour Nginx (l’algorithme de chiffrage, le type de clé supportée, etc.). Si la configuration proposée par défaut ne vous convient pas, vous pouvez évidemment modifier le virtual host.
Exemple de configuration modifiée si vous avez choisi l’option 1 (accepter à la fois les requêtes HTTP et HTTPS) :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/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 }
Exemple de configuration modifiée si vous avez choisi l’option 2 (forcer toutes les requêtes en HTTPS) :
server { listen 80; listen [::]:80; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/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 if ($scheme != "https"){ return 301 https://$host$request_uri; } # managed by Certbot }
Let’s Encrypt aura généré automatiquement 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
- cert.pem : le certificat de votre domaine mondomaine.com
- chain.pem : le certificat Let’s Encrypt
- fullchain.pem : les certificats cert.pem et chain.pem combinés
- privkey.pem : la clé privée du certificat.
3 – Améliorer la sécurité du protocole SSL/TLS (pour Nginx uniquement)
SSL/TLS utilise un système de chiffrement asymétriques (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS.
Pour les utilisateurs du serveur Apache, cette manipulation n’est plus nécessaire depuis la version 2.4.7 car, depuis celle-ci, Apache utilise une clé plus complexe.
- Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions :
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096 $ sudo chmod 600 /etc/ssl/certs/dhparam.pem
- Modifiez votre virtual host en ajoutant la directive ssl_dhparam :
server { listen 80; listen [::]:80; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name mondomaine.com www.mondomaine.com; location / { root /var/www/html; index index.html index.htm; } ssl_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mondomaine.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.com/chain.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE- RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:4m; ssl_session_timeout 1440m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4; add_header Strict-Transport-Security max-age=31536000; }
- Redémarrez votre Nginx :
$ sudo systemctl restart nginx
- Rendez-vous sur SSL Labs et testez la sécurité de votre configuration SSL/TLS !
4 – Renouvellement d’un certificat
Les certificats délivrés par Let’s Encrypt sont valides 90 jours. L’outil certbot fournit une option renew permettant de renouveler l’ensemble des certificats présents sur votre serveur si et seulement si ceux-ci expirent dans moins de 30 jours.
Nous allons créer une règle crontab où le script de renouvellement sera planifié pour exécution tous les lundis à 23h42. Les traces liées à l’exécution du script seront enregistrées dans un fichier /var/log/certbot-renew.log.
- Éditez la crontab :
sudo crontab -e
- Ajoutez la ligne suivante :
- Si vous utilisez le plugin webroot, manual, nginx ou apache :
42 23 * * 1 /usr/bin/certbot renew >> /var/log/certbot-renew.log
- Si vous utilisez le plugin standalone, le serveur doit être arrêté avant le renouvellement du certificat (modifiez nginx en fonction de votre serveur) :
42 23 * * 1 /usr/bin/certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" >> /var/log/certbot-renew.log
- Si vous utilisez le plugin webroot, manual, nginx ou apache :
- Sauvegardez et quittez.
5 – Révocation d’un certificat
Pour révoquer un certificat, il est nécessaire d’exécuter la commande suivante en remplaçant /etc/letsencrypt/live/mondomaine.com/cert.pem par votre domaine ou sous-domaine :
$ sudo certbot revoke --cert-path /etc/letsencrypt/live/mondomaine.com/cert.pem
Ubuntu 18.04 Server LTSNginx 1.14.0
Certbot 0.25.0
Bonjour,
Ce message pour vous remercier pour ce tuto. J’ai lu et essayé un certain nombre de tuto sans succès avant de tomber sur le votre.
J’ai des connaissances en linux plus que limitées mais grace à votre tuto, j’ai pu sécuriser mon reverse proxy nginx avec un certificat let’s encrypt en lieu et place du certificat auto-signé que j’utilisais jusqu’à maintenant.
Encore merci.