11

Il y a quelques jours, j’ai eu la bonne surprise de voir ma demande a la beta de Let’s Encrypt être acceptée. A moi l’argent, la gloire et la crypto !

letsencrypt
Pour rappel, letsencrypt est une autorité de certification (CA) qui ne demande aucune validation humaine de leur part. Pas d’envoie de papiers d’identité ou autre preuves. Pour prouver que vous etes bien possesseur du domaine, il suffit que, lors de la génération du certificat, vous placiez un fichier json accessible a une url « mondomaine.com/.well-known/… ».

La procédure de génération est donnée (et risque d’évoluer d’ici la fin de la beta) mais en résumé:

Make sure your web server displays the following content at                                                                                           
http://mart-e.be/.well-known/acme-challenge/abcdef... before continuing:

{"header": ...}

Content-Type header MUST be set to application/jose+json.

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
echo -n '{"header": ...}' > .well-known/acme-challenge/abcdef...
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map = {'': 'application/jose+json'}; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"
Press ENTER to continue

Super, seulement wordpress ne me laisse pas créer des dossiers arbitraires dans mon dossier contenant le code (et c’est une bonne nouvelle en soit). Pour résoudre cela, un petit bricolage nginx s’imposait.

HTTPS sur un blog, c'est comme un éléphant-mitrailleuse. Ça ne sert pas a grand chose mais c'est cool!

HTTPS sur un blog, c’est comme un éléphant-mitrailleuse. Ça ne sert pas a grand chose mais c’est cool!


Dans la config nginx du blog, ajoutez un bloc location:

Mise à jour: Michel propose une solution plus simple sans s’ennuyer avec un serveur local en python!

server {
       listen 80;
       server_name mart-e.be;
       location ~ /.well-known {
            proxy_pass  http://127.0.0.1:7890;
       }
       
       # reste de la config pour wordpress
}

Où 7890 est un numero de port totalement arbitraire.
Ensuite, suivant +/- les conseils du wizard de letsencrypt

$ mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
$ cd /tmp/letsencrypt/public_html
$ echo -n '{"header":...}  > .well-known/acme-challenge/abcdef...
$ python -c "import BaseHTTPServer, SimpleHTTPServer; SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map = {'': 'application/jose+json'}; s = BaseHTTPServer.HTTPServer(('', 7890), SimpleHTTPServer.SimpleHTTPRequestHandler); s.serve_forever()"

Notez que j’ai changé le numéro de port de 80 a 7890 dans les paramètres de HTTPServer.

On relance NGINX (nginx -s reload), continue l’exécution du wizard (press ENTER) et victoire !

Press ENTER to continue

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

Vous pouvez tuer la commande python une fois validé et retirer la config nginx (ou commentez, le certificat beta ne vaut que 90 jours).

En bonus, la config nginx qui va bien:

ssl_certificate /etc/letsencrypt/live/mart-e.be/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mart-e.be/privkey.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparams.pem;

Avec le fichier dhparams.pem servant à la génération d’une clef diffie-helman, via la commande openssl dhparam -out dhparam.pem 2048

Mozilla a un super générateur de config. J’ai prit la config moderne, désolé utilisateurs de vieux soft, je décroche ainsi un beau A sur le CryptCheck un peu nazi de Aeris !

CrptCheck

Vous pouvez maintenant accéder a mart-e.be en https !

11 commentaires

  1. postblue dit :

    Sympa, ravi de voir ce que ça deviendra à l’avenir. Par contre, j’attends de voir comment le projet pourra se positionner par rapport à CACert (qui remonte sur la voie de la reconnaissance, ai-je l’impression).

  2. mart dit :

    @postblue: j’avoue que s’ils n’arrivent pas a être certifié, ça va être difficile pour eux.
    Ce m’inquiète aussi, c’est le moment ou les 3/4 des certificats SSL seront chez LetsEncrypt

  3. Matlink dit :

    Ce que je ne comprends pas, c’est pourquoi tu fais un proxy_pass alors que tu pourrais servir les fichiers avec un alias ?

  4. Toto dit :

    Passer un blog en HTTPS est important si les visiteurs viennent de pays dans lesquels ils peuvent être inquiétés pour leur idées.

  5. Angristan dit :

    Je conseille 4096 pour le DH.
    Et n’oublie pas de faire la redirection en HTTPS 🙂

  6. Michel Barret dit :

    Euh ça me paraît bien compliqué ! Pourquoi lancer un nouveau serveur web alors que tu en a déjà un ?

    Tu peux configurer nginx ainsi : https://framabin.org/?45d04545527e658b#Vx4lTR4FirmqTl4V60wmmy/Vzmj7mP96u9fw+I5oNkc=

    et arrêter le serveur python SimpleHTTPServer et tu verra que ça marche mieux 🙂

  7. mart dit :

    @Matlink: détails? proxy_pass me semblait le plus facile pour servir un dossier arbitraire. Note aussi le « Content-Type header MUST be set to application/jose+json »

    @Angristan: étant donné que j’ai été un peu stricte (pas compatible IE10 par exemple), je préfère ne pas encore activer la redirection automatique. J’attends aussi la fin de la beta (certificat de 90 jours).
    Pour DH, j’aimerais trouver des détails sur le gain sécu/performance/comptabilité avec les différent navigateurs.

    @Michel: les fichiers doivent être servit en « application/jose+json », je ne pense pas que ça fonctionnera (a tester).

  8. Michel Barret dit :

    Tu sous-estime grandement nginx. C’est un serveur complet !
    Tu peut ajouter/modifier/lire les entêtes sans problème :

    https://framabin.org/?681e28619b0d0b8e#Y7jDgXlXMq9lBeNiRT9gLuD+ANGQUHJWc0X9Noc4Ki4=

  9. Arnaud .D dit :

    Bonjour Mart-E,

    Très bon article qui m’a bien aidé pour rajouter un certificat SSL sur mon serveur VPS.

    Pour informations certains hébergeur comme infomaniak sponsorise le projet ou encore d’autre comme PlanetHoster on déjà déployé ce projet (Cf: https://blog.planethoster.net/exclusivite-ssl-gratuit-a-tous-nos-clients/)

    Je pense personnellement que le futur du web se trouve ici !

    Merci encore pour bon billet.

Laissez un commentaire




Avatars par gravatar, balises html classiques autorisées.

css.php