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 !
11 réponses sur « LetsEncrypt, .well-known et NGINX »
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).
@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
Ce que je ne comprends pas, c’est pourquoi tu fais un proxy_pass alors que tu pourrais servir les fichiers avec un alias ?
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.
Je conseille 4096 pour le DH.
Et n’oublie pas de faire la redirection en HTTPS 🙂
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 🙂
@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).
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=
ah je ne connaissais pas, merci de l’info, c’est plus simple en effet! Je mets à jour l’article.
Bonjour,
Le lien framabin a expiré, et l’article pointe vers celui-ci !
Merci pour l’article.
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.