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