Installer un SSL sur Nginx

Installer un SSL sur Nginx

Installer un SSL sur Nginx avec Webinoly

Attention, ce tuto propose une alternative à Let’s Encrypt, et se base sur la configuration générée automatiquement par Webinoly (lors de la configuration du SSL sur un domaine). Il ne permet pas de créer une configuration Nginx de A à Z (il faudrait plusieurs tutos pour ça). Si vous n’avez pas regardé les tutos sur Webinoly, commencez par là avant de faire celui-ci.

Si vous avez suivi les tutos récents, il y a de grosses chances que vous soyez passés sur NGINX, principalement pour des raisons de performance côté front–end. Il y a aussi des chances pour que vous ayez installé Webinoly sur votre VPS SSD, et que vous ayez profité de la gratuité de Let’s Encrypt.

Cependant, il arrive que CertBot, le robot installé sur Webinoly et qui est chargé de procéder au renouvellement automatique des certificats, plante lamentablement sur certaines opérations de renouvellement. L’erreur est totalement aléatoire, et demeure assez désagréable, car il faut relancer le renouvellement manuellement. Ça fait juste une ligne de commande à rentrer, et ça prend dix secondes, mais c’est pénible.

La solution, c’est d’installer un certificat SSL « classique » sur le serveur.

Si ce que je dis ici n’a aucun sens pour vous, je vous conseille très fortement de commencer par le tutoriel pour installer un certificat SSL sur apache : la procédure est pratiquement la même (et ça vous permettra de comprendre la suite).

  1. On génère un CSR une clé privée
  2. On commande le certificat
  3. On concatène la chaine de certification intermédiaire et le certificat
  4. On place les bons fichiers aux bons endroits
  5. On modifie les adresses des fichiers sur le fichier de conf
  6. On relance Nginx

Générer le CSR et la clé privée

D’abord, on se connecte à son serveur. Placez-vous dans le répertoire de votre choix, et rentrez la ligne de commande permettant de générer le CSR et la clé privée. Vous pouvez utiliser le configurateur de requête OpenSSL que vous trouverez ici.

Dans mon cas, ça donnait ça :

openssl req -new -newkey rsa:2048 -sha256 -nodes -out dev.digital-cookie.io.csr -keyout dev.digital-cookie.io.key -subj '/C=FR/ST=Calvados/L=Caen/O=GDM-Pixel/CN=dev.digital-cookie.io'

Ensuite, on récupère le fichier .key et le fichier .csr

Commander le certificat

Pour la commande, je vais chez NameCheap, qui propose des certificats à tarif ultra compétitif. Pour commander, je dois d’abord fournir mon CSR, puis montrer que j’ai le contrôle du domaine pour lequel j’ai commandé un certificat (c’est la procédure de DCV, Domain Control Validation). Là, j’ai plusieurs options :

  • L’authentification par envoi d’un e-mail
  • L’authentification HTTP (un fichier à placer sur mon serveur)
  • L’authentification DNS (un enregistrement de type CNAME à configurer sur la zone DNS)

Une fois cette formalité effectuée, je reçois mon certificat.

Concaténer la chaîne de certification

La chaîne de certification intermédiaire sert principalement pour les vieux navigateurs : c’est elle qui indique le chemin complet entre le certificat et la racine qu’on retrouve chez l’autorité de certification.

L’opération prend quelques secondes : vous copiez simplement le contenu du fichier ca-bundle dans le fichier .crt que vous avez reçu, et vous enregistrez le tout.

Placer les fichiers sur le serveur

On va faire un truc propre, et mettre les fichiers là où ils doivent être :

  • La clé privée doit être dans /etc/ssl/private
  • Le certificat doit être dans /etc/ssl/certs

Modifier le fichier de configuration

Dans la vidéo, je pars du principe que vous avez déjà une configuration SSL effective avec Let’s Encrypt. Dans ce cas, on va juste modifier l’adresse de la clé indiquée dans le fichier de configuration et l’adresse du certificat avec les bonnes données.

Si vous n’aviez pas installé Let’s Encrypt, vous pouvez utiliser la configuration située ci-dessous (à adapter en fonction de votre configuration locale) :

server {
       #on ecoute le port SSL par défaut, et on precise qu on veut le support http2
       listen 443 ssl http2;
       #idem pour l IP V6
       listen [::]:443 ssl http2;
       #on declare le nom du serveur et ses alias
       server_name www.example.com example.com;

       ssl    on;
       #on declare l'adresse du certificat qu'on a concatene avec les chaines intermediaires
       ssl_certificate    /etc/ssl/certs/ www_example_com.crt;
       #on declare l'adresse de la cle privee
       ssl_certificate_key    /etc/ssl/private/www.example.com.key;

       #ATTENTION ICI, VOIR COMMENTAIRE PLUS BAS
       ssl_stapling on;
       ssl_stapling_verify on;
       #ATTENTION ICI, VOIR COMMENTAIRE PLUS BAS
       ssl_trusted_certificate    /etc/ssl/certs/ www_example_com.crt;

       #on declare l adresse des logs
       access_log /var/log/nginx/example.com.access.log we_log;
       error_log /var/log/nginx/ example.com.error.log;

       #on declare l adresse de la racine du site
       root /chemin/vers/racine/de/votre/site;
       #on declare les fichiers a executer
       index  index.php index.html index.htm;

       #divers location en fonction de vos besoins

location #whateveryouneed {
}
       # divers include en fonction de vos besoins
        include common/truc.conf;
}

server {
       #on ecoute sur le port 80
       listen 80;
       #idem pour IPV6
       listen [::]:80;
       #on declare le nom du serveur et ses alias
       server_name www.example.com example.com;

       #on declare l adresse des logs
       access_log /var/log/nginx/ example.com.access.log we_log;
       error_log /var/log/nginx/ example.com.error.log;

 # redirect http to https www
       return 301 https://example.com$request_uri;
}

*A PROPOS DE “ssl_trusted_certificate etc” —> Testez TOUJOURS votre installation de SSL (le lien est tout en bas), juste pour être sur que vous n’avez pas de souci au niveau de l’OCSP.

Pour faire court, pour vérifier que votre certificat est valide, le navigateur a deux possibilités :

  1. Vérifier auprès de l’autorité de certification que le SSL n’est pas révoqué (c’est long à faire)
  2. Vérifier que le cert est bon grâce à OCSP (“protocole de vérification de certificat en ligne”)

Utiliser le ssl stapling permet donc de raccourcir les échanges avec l’autorité de certification. J’ai toujours procédé en concaténant la chaine de certification intermédiaire et le certificat, et je n’ai jamais eu de souci, même sur les vieux navigateurs. Mais faites quand même le test :)

Si vous n’y connaissez rien et que vous n’avez pas du tout l’habitude de manipuler ce genre de fichiers, je vous déconseille très fortement de faire ça sur un site en production.

Vous pouvez toutefois vous inspirer de la configuration générée avec cet outil https://www.digitalocean.com/community/tools/nginx

Le plus simple, je le répète, c’est d’utiliser Webinoly ou EasyEngine, et d’adapter la configuration en fonction de vos besoins. Personnellement, je n’hésite pas une seule seconde à me faciliter la vie grâce à ce genre de solution, et je procède ensuite par itération en fonction des besoins (je potasse un peu la documentation s’il le faut).

Redémarrer NGINX

Puis on redémarre NGINX après avoir fait un test :

nginx -t

Si pas de messages d’insultes :

Service nginx restart

Et c’est fini !

Et si on a pas commencé avec un certificat Let’s Encrypt ?

Vous avez aussi la possibilité de supprimer purement et simplement la configuration SSL de votre fichier de configuration, avec la commande :

site www.example.com -ssl=off

Ca fait le ménage dans votre fichier, qui revient à son point de départ (accepter les connexions HTTP, et c’est tout).

Ensuite, vous envoyez votre certificat et votre clé privée, toujours dans les même dossiers que précédemment. Pour gérer le SSL stapling, on doit toutefois créer une version de notre certificat au format PEM, grâce à la commande suivante :

cd /etc/ssl
openssl x509 -in /etc/ssl/certs/www_example_com.crt -out /etc/ssl/www_example_com.pem -outform PEM

Puis, vous entrez la commande pour que Webinoly vous refasse la config qui va bien :

sudo site www.example.com -ssl=on -ssl-key=/etc/ssl/private/www.examples.com.key -ssl-crt=/etc/ssl/certs/www_example_com.crt -ssl-ocsp=/etc/ssl/www_example_com.pem

Et boum, c’est magique, c’est fini.

Vérifiez quand même que la config est OK (pas de faute de frappe, pas d’erreurs dans l’adresse des fichiers) :

nginx-t
service nginx restart

Tester l’installation du certificat SSL

Vous pouvez ensuite vous rendre sur SSL labs pour tester l’installation de votre certificat. Si tout s’est bien passé, vous avez un joli A !

Charles Annoni

Charles Annoni

Développeur Front-End et Formateur

Charles Annoni accompagne les entreprises dans leur développement sur le web depuis 2008. Il est également formateur dans l’enseignement supérieur.