meta données pour cette page
Configurer let's encrypt pour Nginx avec Certbot
Nous allons ici faire une configuration multi-domaine pour rendre accéssible plusieurs sites web tous présent sur le même serveur. C'est à dire que le certificat sera valable pour domaine.com, www.domaine.com et web1.domaine.com. Cette approche peut être utile lors d'un service mutualisé.
Configurer Nginx
Dans un premier temps, nous avons besoin de Nginx :
apt install nginx
L'emplacement de nos site web seront les suivants:
mkdir /var/www/domaine.com mkdir /var/www/web1.domaine.com
Nous définissions ces hôtes virtuelles accéssiblent via le port 80. Pour cela on modifie la configuration d'Nginx (Nous aurons pas besoin de la configuration de base) :
unlink /etc/nginx/sites-enabled/default
nano /etc/nginx/sites-enabled/domaine.com
- domaine.com
server { listen 0.0.0.0:80 default_server; listen [::]:80 default_server; server_name domaine.com www.domaine.com; location ~ /.well-known { allow all; } root /var/www/domaine.com; }
nano /etc/nginx/sites-enabled/web1.domaine.com
- web1.domaine.com
server { listen 80; server_name web1.domaine.com; location ~ /.well-known { allow all; } root /var/www/web1.domaine.com; }
Nous devons vérifier que la configuration est bonne :
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Si tout c'est bien passé alors on poursuit en rechargent cette nouvelle configuration :
nginx -s reload
Lors de la création du certificat, Certbot aura juste besoin d'un accès depuis Internet au sites pour récupérer un fichier permettant de valider les futurs transactions.
Configurer Certbot
Maintenant que nos sites sont accéssibles depuis le port 80, attaquons-nous à l'outil de certification :
echo 'deb http://ftp.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/backports.list apt update && apt install certbot -t jessie-backports
Pour les procédures suivantes, nous utiliserons l'utilisateur www-data pour conserver les droits d'accès aux dossiers /var/www/. Dans le cas contraire, lors du téléchargement d'un fichier présent dans le dossier .well-know du domaine ne pourra être lu.
Ainsi, il faut vérifier que les droits soient correcte dont les dossiers suivants :
chown -R www-data.www-data /etc/letsencrypt/live/ chown -R www-data.www-data /etc/ssl/certs/ chown -R www-data.www-data /var/log/letsencrypt/
On lui indique dans quel dossier il doit travailler en ajoutant la directive suivante :
nano /etc/letsencrypt/cli.ini work-dir = /etc/letsencrypt
Nous déclarons enfin nos domaines avec leur emplacements respectif (en mode essai dans un premier temps pour voir s'il y a des erreurs) :
sudo -u www-data certbot certonly --webroot --webroot-path=/var/lib/letsencrypt/ -d domaine.com -d www.domaine.com --cert-name domaine.com --dry-run --test-cert
Si tout se passe bien au niveau des droits notamment, alors on valide la création :
sudo -u www-data certbot certonly --webroot --webroot-path=/var/lib/letsencrypt/ -d domaine.com -d www.domaine.com --cert-name domaine.com
Ensuite, nous créons un fort Diffie-Hellman qui va nous permettre d'avoir une bonne qualité de chiffrement :
sudo -u www-data openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Cette commande peut prendre du temps en fonction de la machine.
Anticipons la suite par la création de snippets :
nano /etc/nginx/snippets/ssl-domaine.com.conf
ssl_certificate /etc/letsencrypt/live/domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domaine.com/privkey.pem;
Nous définissons la force de chiffrement dans le fichier suivant :
nano /etc/nginx/snippets/ssl-params.conf
- ssl-params.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ssl_dhparam /etc/ssl/certs/dhparam.pem;
Il reste a adapter la configuration de nos hôtes :
nano /etc/nginx/sites-enabled/domaine.com
- domaine.com
server { listen 0.0.0.0:80 default_server; listen [::]:80 default_server; server_name domaine.com www.domaine.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl default_server; listen [::]:443 ssl default_server; include snippets/ssl-domaine.com.conf; include snippets/ssl-params.conf; root /var/www/domaine.com; }
nano /etc/nginx/sites-enabled/web1.domaine.com
- web1.domaine.com
server { listen 80; server_name web1.domaine.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; include snippets/ssl-domaine.com.conf; include snippets/ssl-params.conf; root /var/www/web1.domaine.com; }
Nous devons vérifier que la configuration est bonne :
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Si tout c'est bien passé alors on poursuit en rechargent cette nouvelle configuration :
nginx -s reload
Ceci fait, normalement sur nous site, nous sommes rediriger automatiquement en HTTPS. Pour vérifier la qualité du chiffrement, Renseigner vos site sur ssllabs.com.
Automatiser le renouvellement
Lors de la création du certificat, il est valide durant 3 mois. En dehors de ce delais, les sites deviennent innaccéssible vu qu'il n'est plus possible de déterminer sa validité. Il est alors inéressant de créer un tâche cron pour automatiser ce renouvellement :
crontab -e
* * 1 */2 * /usr/bin/sudo -u www-data /usr/bin/certbot renew >> /var/log/letsencrypt/certbot-renew.log * * 1 */2 * /bin/systemctl reload nginx
Ainsi, notre certificat sera renouvellé tous les 1er jours à deux mois d'intervales.
Si l'on souhaite faire le renouvellement à la main:
certbot renew --cert-name www.domaine.net --dry-run --test
Commandes disponible
- Lister tous les certificats
/usr/bin/certbot certificates
- Supprimer un certificat
/usr/bin/certbot delete --cert-name sous.domaine.com
Tester
nmap --script ssl-cert -p 443 --script-args=tls.servername=domaine.com domaine.com