Aujourd’hui via Touitteur j’ai vu que la nouvelle version Mainline de NGINX, c’est à dire la 1.13.0, introduisait le support natif de TLS 1.3. Je me suis dit que c’était l’occasion de mettre tout ça en pratique. Vous pouvez vous amusez à mettre ça en prod sur vos blogs si ça vous chante.
Pour ce billet, je vais m’appuyer sur l’excellent script de mon coupaing Nicolas Simond
NGINX tls 1.3 : Pré-requis
Nous allons donc commencer par installer les paquets qui nous permettront de compiler NGINX
apt-get install libgeoip-dev libxslt-dev libpcre3 libpcre3-dev build-essential zlib1g-dev libbz2-dev libssl-dev tar unzip curl git -y
Ensuite, naviguons vers le repertoire dans lequel nous compilerons notre programme
cd /usr/src
Téléchargeons la dernière version de NGINX et décompressons là
wget https://nginx.org/download/nginx-1.13.0.tar.gz tar -xaf nginx-1.13.0.tar.gz mv nginx-1.13.0 nginx
Nous allons récupérer une version dev d’OpenSSL supportant TLS 1.3 (Le draft 18)
git clone https://github.com/openssl/openssl.git cd openssl git checkout tls1.3-draft-18
NGINX tls 1.3 : Compilation et installation
Avant de lancer la compilation de NGINX, nous allons appliquer le patch Dynamic TLS Records
cd /usr/src/nginx wget https://raw.githubusercontent.com/cujanovic/nginx-dynamic-tls-records-patch/master/nginx__dynamic_tls_records_1.11.5%2B.patch patch -p1 < nginx__dynamic_tls_records_1.11.5*.patch
Passons maintenant à la premiere étape de la compilation : configure. Ici j’attire votre attention sur le fait que les développeurs de nginx ou d’OpenSSL sont des trolls…si si…. Parce que vous avez beau utilisé des versions de NGINX et d’OpenSSL supportant nativement tls 1.3, il frauda quand meme spécifier que vous souhaitez l’activer.
./configure \ --http-client-body-temp-path=/usr/local/etc/nginx/body \ --http-fastcgi-temp-path=/usr/local/etc/nginx/fastcgi \ --http-proxy-temp-path=/usr/local/etc/nginx/proxy \ --http-scgi-temp-path=/usr/local/etc/nginx/scgi \ --http-uwsgi-temp-path=/usr/local/etc/nginx/uwsgi \ --user=www-data \ --group=www-data \ --prefix=/etc/nginx \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --with-pcre-jit \ --with-http_v2_module \ --with-debug \ --with-http_stub_status_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_dav_module \ --with-http_gzip_static_module \ --with-http_sub_module \ --with-http_xslt_module \ --with-file-aio \ --with-threads \ --with-http_ssl_module \ --with-http_geoip_module \ --with-ld-opt=-lrt \ --with-openssl=/usr/src/openssl \ --with-openssl-opt=enable-tls1_3
Nous pouvons lancer la phase de compilation et l’installation
make -j $(nproc) make install
Si tout se déroule comme prévu voici ce qu’un…
nginx -V
…devrait vous retourner
root@noobunbox:/usr/src/openssl$ nginx -V nginx version: nginx/1.13.0 built with OpenSSL 1.1.1-dev xx XXX xxxx TLS SNI support enabled configure arguments: --http-client-body-temp-path=/usr/local/etc/nginx/body --http-fastcgi-temp-path=/usr/local/etc/n ginx/fastcgi --http-proxy-temp-path=/usr/local/etc/nginx/proxy --http-scgi-temp-path=/usr/local/etc/nginx/scgi --http -uwsgi-temp-path=/usr/local/etc/nginx/uwsgi --user=www-data --group=www-data --prefix=/etc/nginx --error-log-path=/va r/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/ng inx.conf --with-pcre-jit --with-http_v2_module --with-debug --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_gzip_static_module --with-http_sub_module --with-http_ xslt_module --with-file-aio --with-threads --with-http_ssl_module --with-http_geoip_module --with-openssl=/usr/src/op enssl --with-openssl-opt=enable-tls1_3 --with-ld-opt=-lrt
NGINX tls 1.3 : Configuration des vhosts
Nous pouvons enfin passer à l’étape finale, la configuration de vos sites. Il vous suffira de modifier la configuration des protocoles ssl en y ajoutant TLSv1.3 comme ci-dessous
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
Et d’ajouter les ciphers suivants à votre variable ssl_ciphers
TLS13-AES-128-GCM-SHA256 TLS13-AES-256-GCM-SHA384 TLS13-CHACHA20-POLY1305-SHA256
Ce qui dans mon cas me donne
ssl_ciphers 'TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384';
Il ne vous reste plus qu’à recharger la configuration NGINX
sudo service nginx reload
It’s aliiiiive
J’ai plus qu’à attendre que le package soit mit à jour alors, étant sous Archlinux ! En tout cas merci pour ce tutoriel qui sera utile à plus d’un.
Vivement de pouvoir passer mes sites en TLS 1.3 ! 😀
Bah chez moi cela ne fonctionne pas… pourtant j’ai la dernière version d’Archlinux avec mon fichier de configuration comme il faut, mais que se soit via Chromium et Firefox, ils utilisent TLS 1.2…
T’as bien activé le support de TLS 1.3 dans tes navigateurs ?
https://support.cloudflare.com/hc/en-us/articles/227172348-How-do-I-enable-TLS-1-3-
Vérifie aussi que ton nginx.conf, ou ton premier vhost chargé, ne limite pas les protocoles à TLSv1.2 – ca m’est arrivé
Effectivement c’était ça, même en ayant Firefox 53 la fonction fonctionne ! Sur ton site de test c’est bien en TLS 1.3. Par contre comme CALOMEL SSL ne le prends pas encore en compte, il m’affiche ce site comme ayant HTTPS bien sécurisé à 50%.
Par contre sur mes sites rien… toujours en version 1.2. Normalement aucuns vhost ne limitent les protocoles, car j’ai réglé cela dans nginx.conf directement ! C’est vraiment étrange ça, le package d’Archlinux ne serait-il pas compiler avec TLS 1.3 ? Si c’était le cas, Nginx m’aurait sortit une erreur lorsque je fais : nginx -t.
Pour avoir le tls 1.3 il faut compiler soit meme, normal que ca ne fonctionne pas si tu récupères les package de ta distro.
Concernant CALOMEL SSL, il n’est pas compatible avec TLS 1.3. Contraitement à SSleuth
Donc impossible pour lui de :
Oui j’ai vérifié dans la foulée avec un petit nginx -V et je n’ai pas le support du TLS 1.3 effectivement 🙂 Je vais attendre qu’il soit pris en compte officiellement tant pis ! 😛 Car sur Archlinux ce n’est pas du tout la même manière pour compiler que sous Debian il me semble. Et puis comme les navigateurs ne sont pas encore nativement compatible (il faut l’activer à la main), c’est pas si grave.
Oui c’est tout à fait exact, mais je préfère CALOMEL SSL à SSleuth. 🙂
Du coup sans s’embêter à compiler, il est possible d’installer depuis les backports non ?
Non la version présente dans les backports est la 1.0.2.
Le master openssl intègre le draft 19, mais celui-ci ne fonctionne pas sous Chrome et Firefox.
Merci pour la précision !