Passage en HTTPS grâce à Let’s Encrypt

Le blog utilise depuis quelques jours HTTPS. J’ai pu mettre en place HTTPS gratuitement grâce à Let’s Encrypt, une initiative supportée par différents acteurs du web visant à sécuriser le web à grande échelle.

Let’s Encrypt

letsencryptLet’s Encrypt résout les deux plus gros freins à l’adoption de HTTPS :

  • Il propose des certificats gratuits reconnus par une autorité de certification et donc considérés comme étant de confiance par la très grande majorité des navigateurs.
  • Il propose également un outil open-source qui prend en charge de manière automatique la configuration du serveur web. Il était jusqu’alors difficile de configurer correctement un serveur web en HTTPS quand on ne connaît pas grand chose au fonctionnement du protocole. L’outil met en place la configuration nécessaire pour le certificat, mais aussi la configuration optimale pour avoir le maximum de sécurité tout en excluant le minimum de clients.

Retour d’expérience

J’avais peu de temps devant moi et je comptais sur l’utilitaire de Let’s Encrypt pour tout faire automatiquement. Pour l’instant l’outil ne fonctionne qu’avec Apache sur des serveurs Debian ou dérivant de Debian, mais ça tombe bien pour moi puisque l’environnement qui fait tourner le blog correspond à ces critères.

J’ai donc lancé le script letsencrypt-auto comme nous l’invite à le faire la documentation et il s’est chargé de tout. Il a d’abord installé les quelques dépendances manquantes via apt-get, puis il a lu la configuration Apache, a listé les virtual hosts qu’il a détectés et m’a demandé lesquels je souhaitais passer en HTTPS. J’ai fait ma sélection, il m’a demandé mon adresse mail, m’a proposé de faire une redirection automatique de HTTP vers HTTPS pour forcer l’utilisation en HTTPS et m’a ensuite dit que c’était terminé. Il m’a d’ailleurs invité à aller voir le rapport proposé par SSLLabs pour vérifier la sécurité. Et il se trouve que tous les voyants sont au vert !

Je suis suis alors rendu sur le blog, et, surprise, tout fonctionnait ! Par sécurité j’avais quand même gardé une copie de la configuration Apache au cas où mais tout s’est bien passé.

Les certificats créés par Let’s Encrypt ne sont par contre valables que 3 mois et, bien que ce soit prévu dans les prochaines version, la version actuelle de l’outil ne supporte pas le renouvellement automatique des certificats. Il faudra donc que je pense à les renouveler manuellement avant leur expiration. Avoir des certificats à durée de vie limitée est clairement quelque chose d’intéressant sur le plan de la sécurité, mais l’absence temporaire d’automatisation clairement un manque qui devrait être bientôt comblé.

Le problème du Mixed Content

Le site fonctionnait parfaitement en HTTPS, mais le navigateur n’affichait pourtant pas le fameux cadenas vert parce que certaines ressources de la page étaient chargées en HTTP. Les navigateurs modernes considèrent que la navigation est sûre que si l’ensemble des ressources chargées le sont en HTTPS. Lorsque ce n’est pas le cas, ils indiquent que, bien que la page actuelle soit servie via HTTPS, certaines ressources ne le sont pas.

Après analyse de la situation, il se trouve que WordPress utilise des adresses absolues pour références les images. Dans tout le contenu existant, les images sont chargées en HTTPS. Je ne sais pas trop pourquoi WordPress utilise des adresses absolues dans le contenu, parce que ça pose problème lors de ce genre d’opération, j’imagine qu’ils ont une bonne raison de le faire. Une petite extension WordPress qui modifie le contenu à la volée avant de l’afficher m’a permis de résoudre le problème.

Pourquoi HTTPS ?

Il est légitime de se poser la question de l’intérêt de HTTPS sur un site comme ce blog dans la mesure où les utilisateurs ne font de la lecture et que tout le contenu est de toute façon public. Il y a en effet peu d’informations confidentielles et un enjeu assez mineur par rapport à un site où on s’identifie et on envoie des informations plus critiques. Si c’est moins important pour les lecteurs, ça l’est davantage pour moi quand je m’identifie dans la console d’administration de WordPress pour écrire du contenu. Il est particulièrement important dans ce cas d’avoir une connexion chiffrée.

A noter que la version HTTP du site redirige maintenant automatiquement vers HTTPS. Cela ne pose normalement pas de problèmes pour les navigateurs, en revanche je ne sais pas comment se comportent les agrégateurs RSS lorsqu’ils rencontrent une redirection. Il faudra peut-être simplement rajouter un petit s vers le début de l’URL pour rétablir le fonctionnement.

Merci à Let’s Encrypt pour cette excellente initiative qui vise à mettre la sécurité à portée de tout un chacun afin de créer un web plus sûr. J’espère que l’arrivée de ce projet (qui n’est pour l’instant qu’au stade de béta) permettra une adoption massive de HTTPS sur le web.

C’est simple et ça fonctionne. Testé et approuvé !

L’image d’en-tête provient de Flickr.

2 thoughts on “Passage en HTTPS grâce à Let’s Encrypt”

    1. Il a coulé pas mal d’eau sous les ponts depuis l’écriture de l’article. Mais en effet le renouvellement automatique est maintenant supporté, même si je n’ai pas pris le temps de regarder comment il fonctionne.

      PoM, du recul sur le mécanisme de renouvellement automatique ?

      Notons par ailleurs que Let’s Encrypt nous prévient par mail à plusieurs reprises quand l’expiration du certificat approche. Pour le moment je me repose sur ces messages.

      De mon côté j’utilise aussi Let’s Encrypt au travail et je me suis débrouillé sans le module Apache. J’utilise du coup la commande suivante pour les créer / renouveler : letsencrypt certonly –standalone -d domaine1.com domaine2.com
      Cela fonctionne bien mais je suis obligé de couper le serveur HTTP(S) (en l’occurrence Apache) pour que Let’s Encrypt fasse ses vérifications sur le nom de domaine. Pas cool cette coupure de service, même si ça ne dure pas bien longtemps. Quelqu’un sait comment ne pas couper le service ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *