LetsEncrypt, .well-known et NGINX
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 !
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.
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 !
Vous pouvez maintenant accéder a mart-e.be en https !