#SSL et #https sous #Nginx: avoir un grade A+ sur Qualys SSL Labs

SSL Server Test www.nicolashug.com Powered by Qualys SSL Labs

Vous connaissez sûrement le https/ssl ? Ce protocole sécurisé qui commence a être pris en compte par Google et qui pour pas un rond (ou presque), permet de sécuriser les transactions avec votre site internet (on va simplifier).

Et bien dans ce tuto je vais vous montrer comment obtenir un certificat SSL, le configurer sur votre serveur et le contrôler pour voir si tout est ok.

Se procurer un certificat SSL

Alors bon, je sais qu’il existe des solutions gratuites (Let’s Encrypt par exemple) pour avoir son certificat SSL, mais là je vais vous montrer comment acheter un certificat SSL pour 14€ comme je le fais moi à chaque fois pour mes projets importants.

Pour ma part, j’utilise Gandi. Des fois ils ont des offres (genre un domaine acheté, le certificat offert pendant 1 an), alors fais un tour sur leur page dédiée au SSL. Là on va prendre l’offre standard à 14€ TTC par an pour un domaine avec et sans www.

Donc pour mon exemple je prend l’offre standard pour 1 an:

Certificat SSL Gandi étape 1

On clique sur choisir et hop on arrive sur la page d’insertion de la CSR (Certificate Signing Request) qui va nous permettre de faire une demande de certificat SSL.

Certificat SSL Gandi étape 2

Donc pour obtenir un certificat SSL il nous faut générer un fichier CSR qui va représenter notre demande. Ce fichier, on va ensuite le transmettre à l’authorité de certification.

Générer une demande de certificat (CSR)

Gandi a un outil pour ça: générer CSR. Cet outil va vous permettre de générer votre CSR très facilement. Remplissez les champs comme indiqué.

Générer CSR Gandi

Rien de plus bien compliqué !

Ensuite cliquez sur « Générer ». L’outil va alors vous indiquer, juste en-dessous du formulaire, la ligne de commande à copier/coller dans votre terminal Linux. Ce qui pourrait donner chez moi:

╭─root@krustyhack ~ 
╰─➤ openssl req -new -newkey rsa:2048 -sha256 -nodes -out domaine.com.csr -keyout domaine.com.key -subj '/C=FR/ST=Bas-Rhin/L=Strasbourg/O=MyOrganisation/OU=IT/CN=domaine.com'
Generating a 2048 bit RSA private key
....+++
...........................................................+++
writing new private key to 'domaine.com.key'
-----

Un fichier .csr et un fichier .key ont été générés. Gardez-le précieusement sous le coude puis retournez au formulaire d’achat du certificat SSL, là où on vous demandait de fournir un CSR. Copiez/collez dedans le contenu du fichier .csr que l’on a généré juste avant et sélectionnez le type de serveur web que vous utilisez. Pour ma part c’est Nginx.

Une fois cela validé, un nouvel écran apparaît où on vous demande la méthode que vous voulez utiliser pour valider la demande de certificat. Choisi celle que vous préfèrez. Perso je prend en général la validation par DNS ou par email.

Validation du certificat

Choisi l’une des 3 options pour valider ta demande

Hop,vous validez, vous vous connectez à votre compte Gandi si ce n’est pas déjà fait et vous validez votre certificat selon la méthode choisie. Via votre interface Gandi, dans l’onglet SSL vous pourrez gérer les certificats ainsi que leur validation.

Installer le certificat sur Nginx

Pour ceux qui ont Apache je suis désolé mais cela fait bien trop longtemps que je n’utilise plus que Nginx pour mes serveurs web. Pour voir comment configurer votre vhost Apache avec votre nouveau certificat: tutorial Ubuntu SSL Apache.

Bon, nous on continue sous Nginx. Vous vous rappellez le fichier .key que l’on a gardé sous le coude ? Il va nous servir maintenant !

Une fois la validation effectuée, récupèrez votre certificat ainsi que le certificat intermédiaire sur votre interface Gandi. Une fois récupérés, ramènez-les sur votre serveur web avec votre fichier .key et mettez  les deux fichiers dans un dossier du genre « /etc/nginx/ssl/www.domaine.com ». Combinez également le fichier du certificat avec le fichier intermédiaire:

╭─root@krustyhack /etc/nginx/ssl/www.domaine.com 
╰─➤ cat www-domaine-com.cer www-domaine-com.interm.cer > www-domaine-com.full.cer

Voilà un outil bien pratique qu’on m’a filé en commentaire: SSL Config Generator. Avec ça, vous pourrez générer votre config SSL serveur Nginx, Apache, Lighttpd, … très facilement. Merci à Aissen et Nova pour le lien.

Il faut maintenant modifier le vhost de votre domaine pour paramétrer le SSL. C’est pas compliqué ! Voilà un mockup d’un vhost que j’utilise avec du SSL:

server {
 server_name domaine.com www.domaine.com;
 listen 80;
 rewrite ^ https://www.domaine.com$request_uri? permanent;
}
server {
 server_name domaine.com;
 listen 443 ssl;
 ssl_certificate /etc/nginx/ssl/www.domaine.com/www-domaine-com.full.cer;
 ssl_certificate_key /etc/nginx/ssl/www.domaine.com/www-domaine-com.key;
 rewrite ^ https://www.domaine.com$request_uri? permanent;
}
server {
 server_name www.domaine.com;
 listen 443 ssl;
 root /var/www/www.domaine.com;
 ssl_certificate /etc/nginx/ssl/www.domaine.com/www-domaine-com.full.cer;
 ssl_certificate_key /etc/nginx/ssl/www.domaine.com/www-domaine-com.key;
 ssl_stapling on;
 ssl_stapling_verify on;
 access_log /var/log/nginx/www.domaine.com/access.log;
 error_log /var/log/nginx/www.domaine.com/error.log;

 [...]

}

Le […] représente les instructions location et autres du vhost. Là je vous donne juste la base pour le SSL. Une fois le vhost prêt, on va attaquer la configuration nginx globale. Dans votre fichier « nginx.conf » rajoutez, dans la partie « http »:

### SSL ###
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
add_header Strict-Transport-Security max-age=15768000;
ssl_dhparam /etc/nginx/ssl/dhparams.pem;

On va maintenant sécuriser le tout avec le concept de confidentialité persistante. Le client et le serveur négocient avec une clé qui est détruite à la fin de la session. La clé privée RSA du serveur est utilisée pour signer une clé d’échange Diffie-Hellman entre le client et le serveur. La clé générée par ce handshake Diffie-Hellman est alors utilisée pour l’encryptage. Vu que la clé pre-maître est spécifique à une connexion entre le client et le serveur, et utilisée uniquement un nombre limité de fois, elle est dite éphémère.

Avec le concept de confidentialité persistante, si un attaquant réussi à avoir la main sur la clé privée du serveur, il ne pourra pas décrypter les communications passées. la clé privée est uniquement utilisée pour signer le handshake Diffie-Hellman qui ne révèle pas la clé pre-maître. Diffie-Hellman s’assure que les clés pre-maître ne quittent jamais ni le client, ni le serveur, et qu’elles ne peuvent pas être interceptées par une attaque MITM (Man In The Middle).

Bref, on génère ce .pem (attention ça va prendre du temps):

╭─root@krustyhack ~ 
╰─➤ openssl dhparam -out /etc/nginx/ssl/dhparams.pem 4096
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
[...]

Une fois votre fichier .pem généré, on test la configuration et on recharge Nginx:

╭─root@krustyhack ~  
╰─➤ nginx -t && nginx -s reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Cool, tout est ok. On contrôle que notre site est également bon:

╭─root@krustyhack ~  
╰─➤  curl -LI https://www.domaine.com
HTTP/1.1 200 OK
[...]

Et maintenant on passe à la validation du certificat.

Tester son https avec Qualys SSL Labs

Pour ça, rendez-vous sur le site de Qualys SSL Labs et entrez l’url de votre site à checker puis validez le tout en cliquant sur « Submit »:

SSL Server Test Powered by Qualys SSL Labs

Entrez l’url de votre site pour en contrôler le https

Le test peut prendre plusieurs minutes, soyez patient. Une fois le contrôle effectué, vous aurez accès à une page récapitulative avec les éventuelles erreurs et problèmes rencontrées, ainsi que le grade global du site. Pour ma part, voici le résultat:

SSL Server Test  www.nicolashug.com  Powered by Qualys SSL Labs

Le grade A+ enfin à nous !

Avec les infos que je vous ai données, vous devriez également avoir un grade A. Si ce n’est pas le cas, n’hésitez pas à me poster un commentaire ou à me contacter sur les réseaux sociaux.

Sources: https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

7 comments

Leave a comment: