Installer un certificat Let’s encrypt pour Nginx et servir WordPress en https

Dans ce billet, voyons comment créer un certificat ssl avec Let’s encrypt et configurer le serveur web Nginx en HTTPS pour l’admin de Wordpress.

La folie Let’s encrypt fait des ravages, tout le monde y passe (même la Freebox!), en même temps c’est tout à fait naturel, pouvoir obtenir un vrai certificat SSL gratuit pour son site web, reconnu par les navigateurs sans message de sécurité, c’est plutôt sympa.

Je n’avais pas vraiment prêté attention à ce buzz au début, mais j’ai franchi le pas, d’ailleurs cet article vous présente un pas-à-pas de l’installation d’un certificat Let’s encrypt pour un serveur Nginx. Et spécialement pour les utilisateurs de WordPress, nous allons sécuriser la partie administration du CMS afin de laisser le site non crypté, car c’est toujours mieux pour les moteurs de recherche et la SEO.

Let’s encrypt

L’installation sous Fedora et consorts se fait très simplement avec dnf :

$ sudo dnf install letsencrypt

 

Lorsque l’installation est terminée, il y a plusieurs moyens de prouver la propriété d’un domaine et ainsi générer un certificat, dans notre cas nous utiliserons la méthode standalone qui a juste un petit point négatif, le serveur web (tout de moins le serveur tournant sur le port 80, dans mon cas c’est plutôt Varnish) doit être stoppé, car le script Let’s encrypt va démarrer son propre serveur web sur ce port (et le 443) afin de se répondre à lui-même et ainsi prouver la propriété du domaine.

Pour stopper Nginx sous Fedora 23 :

$ sudo systemctl nginx stop

 

On peut maintenant lancer le script Let’s encrypt pour vérifier le domaine. Il est possible de spécifier plusieurs domaines en les séparant par des virgules, par exemple pour le domaine nu et sa version avec www :

$ sudo letsencrypt --text --email fabien@feub.net \
--domains www.feub.net,feub.net \
--agree-tos --renew-by-default \
--standalone --standalone-supported-challenges \
http-01 certonly

 

Lorsque le script a terminé son exécution, il donne quelques informations sur le certificat créé, en particulier sur sa date d’expiration :

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.feub.net/fullchain.pem. Your cert will
expire on 2016-05-10. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.

 

Configurer Nginx avec SSL

Le certificat étant créé, on peut configurer le serveur web Nginx. Pour le tutoriel je suppose que votre configuration se situe sous /etc/nginx/nginx.conf.
Comme expliqué en introduction, le but ici est de n’avoir que l’admin de WordPress en HTTPS, c’est-à-dire uniquement https://feub.net/wp-admin (et https://feub.net/wp-login). Pour ceci, on va définir deux server blocks pour le même domaine, un qui servira les pages sur le port 80 et un pour les pages sur le port 443 (HTTPS) et sur le site normal on redirigera vers HTTPS tout ce qui arrive sur /wp-admin.

server {
        listen          80;

        server_name     feub.net;

        root            /var/www/html;
        index           index.php index.html index.htm;

        # Redirection de l'admin WordPress en HTTPS
        location ~ /wp-(?:admin|login) {
                return 301 https://$host$request_uri;
        }

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        # La configuration PHP
        include global/php.conf;
        include global/wordpress.conf;
        include global/things_not_logged.conf;
}

server {
        listen          443 ssl;

        server_name     feub.net;

        ssl_certificate     /etc/letsencrypt/live/www.feub.net/fullchain.pem;
        ssl_certificate_key    /etc/letsencrypt/live/www.feub.net/privkey.pem;

        root            /var/www/html;
        index           index.php index.html index.htm;

        # Redirect all other requests to HTTP.
        location / {
                return 301 http://$host$request_uri;
        }

        # Redirection de l'admin WordPress en HTTPS
        location ~ /wp-(admin|login) {
                # La configuration PHP
                include global/php.conf;

                try_files $uri $uri/ \1/index.php?$args;
        }
}

 

 

Vérification de la configuration Nginx et si tout est ok redémarrage du serveur web :

$ sudo nginx -t
$ sudo systemctl nginx start

 

WordPress

Pour terminer nous allons dire à WordPress d’utiliser HTTPS pour l’admin en ajoutant cette ligne dans le fichier de configuration wp-config.php :

define( 'FORCE_SSL_ADMIN', true );

On vérifie que l’accès au site se fait bien normalement en se rendant sur le site, puis on essaie l’admin de WordPress, on voit que l’on est redirigé sur https://feub.net/wp-login. Cela fonctionne.

Admin WordPress en https
Admin WordPress en https

 

 

 

 

 

 

 

Les certificats Let’s encrypt expirent après 90 jours, il faut donc penser à le renouveler avant la date indiquée lors de sa création.

Signer ses emails sortants avec DKIM

Comme l’explique si bien Wikipedia, DKIM (DomainKeys Identified Mail) est une norme d’authentification du nom de domaine de l’expéditeur d’un courrier électronique. En signant les messages, DKIM vérifie l’authenticité du domaine qui les expédie et garantit leur intégrité.

Ce billet est la suite logique de celui sur l’ajout d’un enregistrement SPF, il va en effet permettre de réduire encore plus les risques d’être déclaré comme spammeur car tous les messages sortants du serveur de messagerie seront signés et donc authentifiés.

Installation et configuration

Les commandes et chemins décris ci-dessous sont ceux d’un serveur Fedora, il suffira de les adapter pour une autre distribution. Sous Fedora l’installation se fait avec dnf désormais :

$ sudo dnf install opendkim

Il faut maintenant éditer le fichier de configuration d’OpenDKIM /etc/opendkim.conf  avec les valeurs ci-dessous (bien entendu il faut remplacer rholala.net par votre nom de domaine).

Mode        s
Domain        rholala.net
KeyFile       /etc/postfix/dkim.rholala.net.key
Selector      mail

En principe le paramètre Mode est à v (vérifier) par défaut, on le passe à s (signer) pour lui dire de signer les messages sortants. Selector quand à lui est un identifiant, je le mets à mail, mais libre à vous de choisir autre chose.

Lorsque ceci est fait, mettre à jour la configuration de Postfix (sous /etc/postfix/main.cf) pour prendre en compte OpenDKIM :

milter_default_action     = accept
milter_protocol         = 2
smtpd_milters             = inet:localhost:8891
non_smtpd_milters         = inet:localhost:8891

Générer les clés DKIM

Il faut maintenant générer les clés qui serviront à la signature cryptographique des entêtes des messages :

$ opendkim-genkey -t -s mail -d rholala.net

Cette commande va créer 2 fichiers mail.private et mail.txt. Le premier est la clé privée qui sera utilisée par OpenDKIM pour signer les messages, on peut copier celle-ci sous /etc/postfix en la renommant en dkim.rholala.net.key comme dans le fichier de configuration d’OpenDKIM que nous avons modifié au début de ce billet. Le second fichier est l’enregistrement DNS à ajouter, il ressemble à ceci :

mail._domainkey IN      TXT     ( "v=DKIM1; k=rsa; t=y; " "p=MGIfMA0GCD5BouQIDAQAB" ); ----- DKIM key mail for rholala.net

(J’ai volontairement tronqué la chaine commencant par "p=MGI" car elle est très longue.)

Ajout du DNS record

Il faut donc ajouter cet enregistrement dans votre zone, je ne l’explique pas ici car cela dépend du type de gestion DNS que vous utilisez.

Lorsque ceci est fait et après un temps de propagation, vous pouvez tester votre DNS record :

$ dig TXT mail._domainkey.rholala.net

Fin et test de la mise en place de DKIM

Il est temps de démarrer le service DKIM et de l’activer par défaut au démarrage de la machine :

$ sudo systemctl start opendkim
$ sudo systemctl enable opendkim
$ sudo systemctl reload postfix

Lorsque ceci est fait, on peut tester si les messages sortants sont bien signés. Pour ce faire, il suffit de regarder les entêtes des emails envoyés depuis le serveur, par exemple :

Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of postmaster@rholala.net designates 5.196.74.38 as permitted sender) smtp.mailfrom=postmaster@rholala.net;
       dkim=pass (test mode) header.i=@rholala.net
DKIM-Filter: OpenDKIM Filter v2.10.3 erebor.rholala.net 3C6E7112B4FD
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rholala.net; s=mail;

Mais il existe bon nombre d’outils en ligne pour tester ce genre de choses :

Faîtes votre choix!

Résultat Mail Tester
Résultat Mail Tester