Let's Encrypt & Ghost .onion? ()

Dorénavant, il vous est maintenant recommandé d'utiliser le client certbot* plutôt que le script letsencrypt.sh (comme ci-dessous) pour mettre en place et renouveler vos certificats Let's Encrypt. + d'infos

Il y a un moment que je voulais poster ce billet, j'ai entamé sa rédaction il y a quelques mois déjà lors du passage de nefald.fr au full HTTPS en novembre 2015.

Je ne l'ai jamais finalisé.

Vu qu'aujourd'hui j'ai changé de nom de domaine, passant de bibehck.fr à hiob.fr, que j'ai refait une beauté à mon blog, il ne me restait plus qu'à le passer lui aussi au HTTPS, chiffré en TLS (https) histoire de naviguer en toute sécurité, les certificats X.509 sont signés par cette merveilleuse autorité de certification qu'est Let's encrypt.

Mon blog tout comme celui de Nefald fonctionne grâce à Ghost, de fait la configuration de Ghost et de Nginx est identique.

Créer les certificats

Je ne vais rien inventer, Let's Encrypt est très simple d'utilisation, il suffit de suivre la documentation officielle (ou l'article de mondedie.fr pour les allergiques).

Arrêtons Nginx (et Ghost)

service nginx stop  

Mettez à jour votre serveur et installez git

apt-get update && apt-get upgrade  
apt-get install git  

Clonez le repo et entrez-y

cd /tmp  
git clone https://github.com/letsencrypt/letsencrypt  
cd letsencrypt  

Allez, dernière étape, générons le/les certificats. Par défaut la clé RSA est de 2048bits, vous pouvez ajouter le paramètre --rsa-key-size 4096 pour une clé en 4096bits.

./letsencrypt-auto --help all
./letsencrypt-auto certonly --rsa-key-size 4096

S'ouvrira alors une GUI. Il vous suffit d'indiquer un email de contact. Puis les noms de domaines pour lesquels vous souhaitez un certificat.

Exemple : hiob.fr www.hiob.fr comments.hiob.fr

Validez et patientez quelques instants.

Voilà! Vous devriez apercevoir un joli Congratulations ! et le chemin menant à vos certificats, a priori /etc/letsencrypt/live/<domaine>.

Configurer Ghost

Indiquons maintenant à Ghost l'url en https.
Ouvrez le fichier config.js se trouvant à la racine de votre blog et éditez l'url de production, il suffit de mettre https en lieu et place de http.

Voilà, laissez reposer, passez maintenant à Nginx.

Configurer Nginx

On va donc rediriger les entrées en http://domaine.ext vers https://domaine.ext, le tout avant de partir sur un reverse proxy pour pointer sur son Ghost. Dans ma configuration vous remarquerez que j'en profite pour rediriger le sous-domaine www.domaine.ext vers domaine.ext, question d'hygiène.

Vous devrez remplacer les occurrences qui suivent, par vos informations : <DOMAINE.EXT>,<IP> et <PORT>.

Assurez-vous bien que le chemin menant à vos certificats soit correct.

/etc/letsencrypt/live/<DOMAINE.EXT>/fullchain.pem;
/etc/letsencrypt/live/<DOMAINE.EXT>/privkey.pem;

Créez le fichier params.conf qui contiendra votre configuration du SSL pour l'ensemble de vos sites sous Nginx - nano /etc/nginx/ssl/params.conf

et collez-y ce qui suit:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  
ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA";  
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;  

sauvegardez puis éditez le fichier nginx.conf - nano /etc/nginx/nginx.conf

et ajoutez les lignes en bas:

http {  
    include /etc/nginx/ssl/params.conf;
}

La configuration

server {  
    listen <IP>:80;

    server_name <DOMAINE.EXT>;

    return 301 https://$server_name$request_uri;
}

server {  
    listen <IP>:443 ssl;

    server_name <DOMAINE.EXT>;

    if ($host = 'www.<DOMAINE.EXT>' ) {
         rewrite  ^/(.*)$  https://<DOMAINE.EXT>/$1  permanent;
}

    ssl on;
    ssl_certificate /etc/letsencrypt/live/<DOMAINE.EXT>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<DOMAINE.EXT>/privkey.pem;

  location ^~ / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://127.0.0.1:<PORT>;
    }
}

Voilà, relancez Ghost et Nginx! Vous voilà en HTTPS. :)

Bonus : Isso

À lire : Installer Isso

Étant donné que j'utilise Isso en guise de serveur de commentaires auto-hébergé, je me dois là aussi de le proposer en https. Mon sous-domaine pour Isso est comments.hiob.fr, je l'ai donc déclaré à Let's Encrypt.

Tout d'abord indiquez à Isso que le site de destination est en https avec la variable host dans la section [general]

[general]
host = https://<DOMAINE.EXT>/  

Éditez maintenant la configuration de Nginx

server {  
    listen <IP>:80;
    server_name <DOMAINE.EXT>;
    return 301 https://$server_name$request_uri;
}

server {  
    listen <IP>:443 ssl;
    server_name <DOMAINE.EXT>;
    ssl_certificate /etc/letsencrypt/live/<DOMAINE.EXT>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<DOMAINE.EXT>/privkey.pem;

    access_log /var/log/nginx/<DOMAINE.EXT>_access.log;
    error_log /var/log/nginx/<DOMAINE.EXT>_error.log;

    location / {
        proxy_pass http://localhost:<PORT>;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Aussi assurez-vous que dans votre thème Ghost, l'url du script soit correcte dans la page post.hbs

<script data-isso="//comments.domain.ext/" src="//comments.domain.ext/js/embed.min.js"></script>  
<script data-isso="//comments.domain.ext" src="//comments.domain.ext/js/count.min.js"></script>  

Tout est ok? Vous pouvez relancer Isso et Nginx !

Pour formater votre commentaire, vous pouvez utiliser le Markdown