Vous avez sûrement déjà dû croiser nginx, et vous devez sûrement l'utiliser si vous avez suivi des tutoriels sur mondedie.fr. nginx est un serveur web et reverse proxy, qui se distingue de son principal concurrent Apache par son fonctionnement asynchrone, lui conférant ainsi des performances élevées. nginx est développé en deux branches : stable et mainline. Nous nous intéresseront à la branche mainline.

Quant à LibreSSL, c'est un fork d'OpenSSL (qui contient des algorithmes et des implémentations cryptographiques nécessaires pour le fonctionnement de SSL/TLS) réalisé par l'équipe d'OpenBSD en réaction à la faille Heartbleed. L'équipe y a découvert du code obsolète (support inutile de vieux OS, de vieux navigateurs, par exemple), voire dangereux (algorithmes connus pour leurs vulnérabilités, par exemple). Depuis bientôt deux ans, un grand audit et nettoyage du code a lieu, et l'équipe ne fait pas défaut à ses qualificatifs historiques en proposant un code le plus propre possible. LibreSSL est à la base conçu pour OpenBSD, mais s'étend désormais à d'autres plateformes, comme GNU/Linux. Le projet LibreSSL-portable facilite ceci.

Compiler nginx est le moyen le plus simple et le plus propre de le faire fonctionner avec LibreSSL, puisque nous utiliserons un lien static vers les bibliothèques nécessaires. De plus, libre à vous d'ajuster nginx à vos besoins en ajoutant/retirant des modules. Contrairement à Apache, cela se fait à la compilation. Compiler permet aussi un contrôle fin de la modularité de nginx.

Partons du principe que vous utilisez Debian Jessie, les manipulations doivent cependant être similaires pour les versions ultérieures, antérieures, et dérivées. Pensez à faire un backup de votre /etc/nginx actuel. Commençons par installer les paquets pré-requis :
apt-get update && apt-get install -y --no-install-recommends --no-install-suggests \
    build-essential \
    ca-certificates \
    automake \
    autoconf \
    libtool \
    perl \
    git \
    wget \
    libpcre3 \
    zlib1g \
    libpcre3-dev \
    zlib1g-dev

# Si nginx est déjà installé
service nginx stop
apt-get purge -y nginx
mv /etc/nginx /etc/nginx-bkp
Maintenant, attaquons LibreSSL pour commencer. Créons un dossier libressl dans /tmp et téléchargeons les sources de LibreSSL portable :
mkdir /tmp/libressl && cd /tmp/libressl
wget -qO- https://github.com/libressl-portable/portable/archive/master.tar.gz | tar xz --strip 1
Pour préparer, configurer la compilation, et vérifier si les pré-requis sont correctement détectés :
./autogen.sh && ./configure LDFLAGS=-lrt --prefix=/tmp/libressl/.openssl/
Plus qu'à compiler avec make !
(tip : nproc devrait retourner le nombre de coeurs CPU à disposition, le préciser avec le paramètre j permet d'accélérer considérablement la compilation)
make install-strip -j $(nproc) 
Maintenant, on s'occupe de nginx. Ce sont à peu près les mêmes étapes. On créer un dossier temporaire :
mkdir /tmp/nginx && cd /tmp/nginx
On souhaite installer le dernier nginx, actuellement nginx mainline est à sa version 1.9.9. Pour éviter de se répéter, créons une variable :
NGINX=1.9.9
Et récupérons donc ces sources :
wget -qO- http://nginx.org/download/nginx-${NGINX}.tar.gz | tar zxf -
cd nginx-${NGINX}
Il va désormais falloir configurer la compilation, cette fois-ci pas la peine de générer le .configure, il est déjà présent. Cette étape est cruciale car c'est ici que nous préciserons à nginx de se compiler avec telle version d'OpenSSL (ici LibreSSL qu'on vient de compiler) et avec tel ou tel module. Voici mon exemple qui devrait satisfaire à peu près tout le monde (avec support http2, compression avec gzip) :
./configure --with-http_ssl_module \
                --with-http_v2_module \
                --with-http_gzip_static_module \
                --with-http_stub_status_module \
                --with-openssl=/tmp/libressl \
                --with-ld-opt="-lrt" \
                --prefix=/etc/nginx \
                --http-log-path=/var/log/nginx/access.log \
                --error-log-path=/var/log/nginx/error.log \
                --sbin-path=/usr/local/sbin/nginx \
                --user=nginx \
                --group=nginx
Voici d'autres paramètres intéressants à rajouter si vous en avez envie :
--with-file-aio
--with-threads
# cf. https://www.nginx.com/blog/thread-pools-boost-performance-9x/

--with-ipv6
# Avec le support de l'ipv6 !

# Désactivez ces modules si vous n'en avez pas l'utilité :
--without-http_scgi_module
--without-http_uwsgi_module
--without-http_fastcgi_module
# Soyez sûr à 100% de ce que vous désactivez

./configure --help
# Vous aidera pour le reste !
Si l'utilisateur nginx n'est pas présent, créez-le.
adduser --system --no-create-home --group nginx
Compilons !
make -j $(nproc)
Enfin, si tout s'est bien passé, ce devrait être le cas, installons notre version fraîchement compilée :
make install
Lancez la commande nginx -V, celle-ci devrait vous retourner quelque chose de similaire :
nginx version: nginx/1.9.9
built by gcc 4.9.2 (Debian 4.9.2-10)
built with LibreSSL 2.3.2
TLS SNI support enabled
configure arguments: ...
En théorie, ça roule. Maintenant, il faut configurer nginx.
Ce lien vous aidera beaucoup : https://www.nginx.com/resources/wiki/start/topics/examples/full/
Je vous propose également "une base" qui satisfaira à peu près tout le monde : https://gist.github.com/Wonderfall/e275241316f4509131fb
À ajuster à vos besoins si nécessaire. Il est utile de créer le dossier sites-enabled dans lequel vous mettrez vos vhosts :
mkdir /etc/nginx/sites-enabled
Tout est bon, mais, je vous propose un petit bonus : la configuration SSL/TLS qui va avec, à placer dans /etc/nginx/conf :
# /etc/nginx/conf/ssl_params.conf
ssl_protocols TLSv1.2;
ssl_ciphers "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256";
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

add_header Strict-Transport-Security "max-age=31536000";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
C'est une configuration solide, avec laquelle vous aurez un A+ sur ssllabs et sur n'importe quel test du genre d'ailleurs.
Cette configuration est clairement à adapter si vous visez un public totalement neutre. Mais normalement, ça devrait fonctionner à partir du moment où le visiteur utilise un navigateur/OS moderne.

Vous pouvez l'inclure dans chaque block server qui fonctionne avec l'HTTPS avec :
include /etc/nginx/conf/ssl_params.conf;
Testons tout cela ! Oh, vous l'aurez remarqué, j'utilise un cipher atypique : ECDHE-RSA-CHACHA20-POLY1305.
ChaCha20 & Poly1305 sont implémentés dans LibreSSL mais ne le seront dans OpenSSL que prochainement (version 1.1.0, bref dans un moment). ChaCha20 est particulièrement performant sur du matériel non-optimisé pour AES, en gros : AES < ChaCha20 < AES-NI (instructions AES). Il est très apprécié par Google qui l'intègre déjà à Android (depuis 5), Chrome, et BoringSSL.

LibreSSL vous offre une alternative cryptographique (ce qui est très apprécié) qui rivalise avec AES.
Pour les explications approfondies je vous confie à Bortzmeyer : http://www.bortzmeyer.org/7539.html
Vous ne faites pas comme la masse.
Bon, j'espère que ça sera quand même utile à certains curieux.
Répondre…