Salut à tous, aujourd’hui on va prendre 15 minutes pour ajouter le support de TLS 1.3 pour nginx sous Debian 9 pour geekeries.org. En effet, la nouvelle version de TLS sortie en sortie en aout 2018 commence à faire son chemin et ajouter son support à geekeries.org est parfaitement inutile, pour l’instant, il est donc totalement indispensable de le faire.
TLS1.3 pourquoi ?
TLS1.3 est une nouvelle version du protocole de chiffrement des communications HTTPS. Il s’agit du dernier rejeton de la famille SSLv2, SSLv3, TLS 1.0, TLS 1.1, TLS 1.2 et TLS 1.3 (par ordre d’apparition). Comme toute nouvelle version d’un logiciel, TLS1.3 apporte des gains de performances, de sécurité et de fonctionnalité (plus de détails ici).
TLS1.3 et nginx
Alors la bonne nouvelle c’est que nginx supporte TLS1.3 depuis sa version 1.13. Il nous suffit donc, en théorie, de rajouter la directive ci-dessous dans le fichier de configuration /etc/nginx/nginx.conf, si vous avez une version ultérieure (et de mettre à jour sinon) :
ssl_protocols TLSv1.3 TLSv1.2;
Pourtant, quand je test cette configuration chez Qualys, on s’aperçoit que le support de TLS 1.3 n’est pas actif. Mais pourquoi donc me direz-vous ?
Simplement parce que nginx n’implémente pas lui-même sa cryptographie, il délègue cette partie à la OpenSSL (comme beaucoup de programme sous Linux.
OpenSSL et TLS1.3
Sauf que, OpenSSL n’implémente TLS1.3 qu’à partir de sa version 1.1.0. Il faudra donc mettre à jour OpenSSL sur votre serveur (si besoin). Sur ma machine, la version d’OpenSSL est théoriquement suffisante 1.1.1a. Néanmoins, la version 1.1.1b vient de sortir au moment où j’écris cet article, et corrige un bug avec TLS 1.3. Du coup, j’en profite pour la mettre à jour depuis les sources sur mon serveur.
cd /opt
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1b.tar.gz
tar -xvf OpenSSL_1_1_1b.tar.gz
rm OpenSSL_1_1_1b.tar.gz
cd openssl-OpenSSL_1_1_1b
./config
make
make test
make install
Et on peut vérifier la version d’Openssl installée ainsi :
openssl version
Ciphersuites
Si vous aviez déjà fait une passe de sécurisation de votre serveur web comme je vous l’avais expliqué précédemment ici. Il est probable que vous ayez configuré des ciphersuites spécifiques pour n’autoriser que celles les plus robustes ou compatibles avec le plus de client.
En spécifiant ces suites, on inhibe le comportement par défaut de nginx et on désactive, par omission, les nouvelles suites supportées lors de mises à jour ultérieures de nginx. Il faut donc mettre à jour notre directive ssl_ciphers dans /etc/nginx/nginx.conf :
ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES;
Activer TLS 1.3 dans nginx
Bon, à ce stade, ça ne fonctionne toujours pas chez moi… il reste une grosse blague faite par les gars de nginx… En effet, si la version de nginx que j’utilise supporte « nativement » TLS 1.3, le protocol n’est pas activé pour autant ! Il faut l’activer lors de la compilation avec l’option –with-openssl-opt=enable-tls1_3. Et on peut vérifier que la version pré-packagés installé depuis les repos officiels de nginx n’a pas été compilé avec grâce à la commande suivante.
nginx -V
Elle liste les options de compilation utilisées et on s’aperçoit de l’absence de « enable-tls1_3 ». On va donc être obligé de passer par une compilation et installation depuis les sources ! Procédure :
cd /opt
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -xvf nginx-1.15.8.tar.gz
rm nginx-1.15.8.tar.gz
cd nginx-1.15.8
# ci-dessous je reprend "bêtement" les options de la compilation précédente, en ajoutant le support tls1.3
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.15.9/debian/debuild-base/nginx-1.15.9=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --with-openssl=/opt/openssl-OpenSSL_1_1_1b --with-openssl-opt=enable-tls1_3
make
make install
nginx -V # Vérifier la présence des options de compilation pour tls1.3 et que le numéro de version est le bon.
nginx -t # Vérifier que votre configuration est compatible avec cette version.
service nginx restart # On redémarre,
service nginx status # et on vérifie que ça tourne..
Et voilà !
Tester le support de TLS 1.3
On peut s’assurer du support de TLS1.3 avec la commande suivante :
openssl s_client -tls1_3 -connect geekeries.org:443
[...]
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA38
[..]
ou avec le test de Qualys :
Conclusion
Un dernier point, la cipherlist que je propose au-dessus permet d’obtenir un bon score chez Qualys dans la catégorie Cipher Suites (mais pas le maximum, voir cypherli.st pour les intégristes). Néanmoins, elle ne supporte pas tous les clients et particulièrement les plus anciens. Pour ma part, je m’en tape : si vous n’êtes pas capable de mettre à jour vos navigateur et OS, vous n’avez rien à faire sur mon site (et vous ne lirez probablement jamais ces lignes aussi…^^). Mais sur des sites à plus forte audience, soyez plus « ouvert d’esprit« …
Aussi, avant de spammer votre site avec Qualys pour déterminer vos ciphers supportés, n’oubliez pas que nmap propose de lister les cyphersuite, via un script nse, autorisées par un serveur :
nmap --script ssl-enum-ciphers -p 443 geekeries.org
Bref, je me suis bien arraché les cheveux avant de comprendre pourquoi TLS 1.3 pour nginx sous Debian ne s’activait pas malgré le fait que toutes les bonnes versions de soft étaient en place sur le serveur. Et c’est tout pour aujourd’hui, bon déploiement de tls 1.3 à vous.