Blog

HTTPS - Sécuriser votre site Drupal avec Nginx et Let's Encrypt

04.12.2017
Let's Encrypt

Introduction

Let's Encrypt est une autorité de certification (CA) qui fournit un moyen facile d'obtenir et d'installer des certificats TLS et SSL gratuitement, ce qui permet d'appliquer le protocole HTTPS sur les serveurs WEB.

Il simplifie le processus en fournissant un logiciel, le Certbot, qui permet d'automatiser la plupart des étapes d'installation.

Dans ce tutorial nous allons voir comment installer le protocole HTTPS sur notre serveur, en utilisant Let's Encrypt par le biais de NGINX.

NGINX est une alternative au serveur HTTP populaire à Apache2. Il peut être utilisé comme un reverse proxy, un serveur de messagerie ou un serveur WEB. Celui-ci nous permet donc d'installer notre solution HTTPS.

Ce tutorial a été fait depuis la derniere distribution Debian en date, Debian 8 Jessie.

Installation de Let's Encrypt

La première étape de l'utilisation de Let's Encrypt pour obtenir un certificat SSL consiste à installer le paquet certbot-auto sur votre serveur. Actuellement, le meilleur moyen d'installer certbot est de le télécharger depuis le site de l'EFF.

Nous pouvons télécharger le certbot-auto Let's Encrypt client dans le répertoire /usr/local/sbin :


cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto

Nous avons maintenant une copie de certbot-auto dans ce répertoire.

Rendre le script exécutable en tapant:


chmod a+x /usr/local/sbin/certbot-auto

Installation de NGINX sur le serveur

Pour installer NGINX sur le serveur, lancez les commandes suivantes :


apt-get update
apt-get install nginx

Obtenir un certificat

Nous allons utiliser une méthode s'appelant Webroot pour installer facilement le certificat sur votre serveur.

Le plugin Webroot fonctionne en plaçant un fichier spécial dans le répertoire /.well-known dans le dossier racine de votre site, qui peut être consultable par le serveur de Let's Encrypt pour valider votre certificat. Selon votre configuration, vous devrez peut-être autoriser explicitement l'accès au répertoire /.well-known.

Pour s'assurer que le répertoire est accessible à certbot-auto pour validation, modifions rapidement notre configuration Nginx. Par défaut, il se trouve dans /etc/nginx/sites-available/default. Nous utiliserons nano pour l'éditer:


server { ...
       location ^~ /.well-known/ {
         auth_basic off;
       }
       location ^~ /.well-known/acme-challenge/ {
         auth_basic off;
       }
... }

Nous pouvons créer les deux dossiers nécessaires à la racine du site .well-know et acme-challenge, il faut que ces deux dossier soient accessibles en lecture et écriture.

Je conseille d'ajouter un fichier .htaccess dans les deux dossiers afin de ne pas avoir des problèmes de permissions lors de la génération du certificat par Let's Encript.


#
# Apache/PHP/Drupal settings:
#
# Protect files and directories from prying eyes.
# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# Follow symbolic links in this directory.
Options +FollowSymLinks
  Options +SymLinksIfOwnerMatch

# Make Drupal handle any 404 errors.
ErrorDocument 404 /index.php

# Set the default handler.
DirectoryIndex index.php index.html index.htm

# Override PHP settings that cannot be changed at runtime. See
# sites/default/default.settings.php and drupal_environment_initialize() in
# includes/bootstrap.inc for settings that can be changed at runtime.

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on

  # Set "protossl" to "s" if we were accessed via https://.  This is used later
  # if you enable "www." stripping or enforcement, in order to ensure that
  # you don't bounce between http and https.
  RewriteRule ^ - [E=protossl]
  RewriteCond %{HTTPS} on
  RewriteRule ^ - [E=protossl:s]
</IfModule>

Pour terminer, on redémarre NGINX :


service nginx restart

Maintenant que nous connaissons notre chemin webroot, nous pouvons utiliser le plugin Webroot pour demander un certificat SSL avec ces commandes. Ici, nous spécifions également nos noms de domaine avec l'option -d. Si vous voulez qu'un cert unique fonctionne avec plusieurs noms de domaine (par exemple, example.com et www.example.com), veillez à les inclure tous, en commençant par le domaine de plus haut niveau (par exemple, example.com). Assurez-vous également que vous remplacez les parties en surbrillance par le chemin webroot et les noms de domaine appropriés:


certbot-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d d7.drupal.fr -d www.drupal.fr

Si tout se passe bien, voici ce qu'on l'obtient :


Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for d7.drupal.fr
Using the webroot path /home/drupal/www for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Unable to clean up challenge directory /home/drupal/www/.well-known/acme-challenge
Generating key (2048 bits): /etc/letsencrypt/keys/0004_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0004_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/d7.drupal.fr/fullchain.pem. Your cert will
   expire on 2017-05-30. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - 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

Nous avons maintenant 4 fichiers dans le répertoire /etc/letsencrypt/live/d7.drupal.fr :

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

 Le certificat est prêt mais nous allons augmenter le degré de sécurité du site en utilisant cette commande :


openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Après quelques instants, nous obtenons ce fichier :

/etc/ssl/certs/dhparam.pem

Configurer TLS / SSL sur NGINX

Nous allons éditer le fichier de configuration de NGINX :


 nano /etc/nginx/sites-available/default

Copiez collez lla configuration ci-dessous en replaçant les éléments en gras par le nom de votre domaine :


server {
        listen 443 ssl;

        server_name d7.drupal.fr;
        ssl_certificate /etc/letsencrypt/live/d7.drupal.fr/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/d7.drupal.fr/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers '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';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;
} 

server { listen 80; server_name d7.drupal.fr www.d7.drupal.fr; return 301 https://$host$request_uri; }

 

Il ne reste plus qu'à redémarrer le serveur avec cette commande pour que votre site soit accessible en https : 


service nginx restart

Un projet ? Parlons-en

Nous sommes à votre écoute pour étudier vos besoins
et vous proposer les meilleures solutions.

Autres articles