Déployer Let’s Encrypt sur Heroku et nom de domaine custom chez [OVH]

Il y a eu beaucoup de bruit relativement récemment pour une initiative très intéressante soutenue notamment par Mozilla : Let’s Encrypt.

Let’s encrypt, qu’est ce que c’est ?

L’idée est de fournir des certificats SSL reconnus et valides gratuitement. Jusque là, les certificats SSL coûtaient une petite fortune pour les valides ou devaient être des auto-signés pour être gratuit mais n’étaient jamais reconnus par les navigateurs. Forcément, cette superbe initiative a été un énorme pavé dans la mare.

Contexte

Cette idée est bonne mais la mise en place n’est que rarement expliquée, pas claire et comme pour tout, propre à chaque type d’installation. Je n’ai rien trouvé sur un hébergement sur Heroku et un nom de domaine custom, chez OVH ici. Et surtout je voulais que d’un bout à l’autre ce soit le moins cher possible. Il y a des extensions Heroku qui proposent de facilement sécuriser votre site en HTTPS mais elles coûtent entre 12$ à 20$ par mois minimum.

La procédure suivante est valable sur Debian, très probablement sur tous les environnements type Linux/Unix. Normalement, ça marche aussi sur Mac. Je ne suis pas sur du matos Apple, je ne vous expliquerai pas comment faire, je ne le sais pas et je m’en fous. Ça vous changera de tous ces tutoriels faits sur mac pour mac et qui s’en foutent des gens qui ne sont pas sur mac (et qui ont une éthique, pour faire court).


Ok go !

On commence par installer l’un des robots de Let’s Encrypt : Certbot. C’est lui qui nous permettra de générer les certificats dont on a besoin.

Normalement, si tout s’est bien passé, vous devriez avoir un message d’assistance. Certbot est donc prêt à l’usage et vous pouvez déjà commencer par lire cette aide, ça vous aidera à mieux cerner l’outil.

On va maintenant générer les certificats qui nous intéressent. Ici, je veux des certificats pour un domaine, dit “nu”, nommé “mondomaine.fr” et son pendant “www.mondomaine.fr” avec le sous-domaine www. Une adresse mail de contact est obligatoire.

Comme vous pouvez le voir, il suffit d’ajouter un paramètre “d” pour chaque domaine qu’on veut sécuriser.

Là il va vous demander si ça vous dérange d’enregistrer votre IP, bon évidement, pas vraiment le choix. Puis il va vous fournir quelques explications sur comment répondre au “challenge ACME”.

Qu’est-ce que ACME ?

On est sur un post de mise en pratique, pour en savoir plus, ça se passe ici : https://github.com/ietf-wg-acme/acme/blob/master/draft-ietf-acme-acme.md

Comment répondre au challenge ACME ?

En gros, l’outil s’attend à ce que votre site fournisse à une URL qu’il vous donne, une réponse très précise. L’URL est du genre :

http://mondomaine.fr/.well-known/acme-challenge/[unechainecompliquée]

Cette URL doit répondre avec une chaîne encore plus longue qui vous est aussi fournie en même temps. Il va vous demander la même chose pour tous les domaines à vérifier.

Attention, mettez en place cette page de suite parce que la vérification se fera à l’étape suivante ! Vous pouvez bien entendu laisser l’outil en attente, il ne s’enfuira pas, le temps de mettre ces pages en ligne.

Il y a même un exemple python pour vraiment vous inciter à les mettre en ligne de suite.

Etape de vérification

Maintenant que l’outil vous a affiché toutes les URL et réponses qu’il attend, il va aussitôt lancer la vérification automatiquement, sans vous laisser la main (je vous avais prévenu).

Si vous n’avez pas encore mis en place les pages correspondantes, il va vous dire “verification failed” et vous n’avez plus qu’à recommencer.

Si vous avez réussi, il vous dira “congratulations !” et il a raison, bravo ! Prêtez bien attention à ce message, il y a aussi l’adresse physique où retrouver vos certificats.


Direction Heroku !

Heroku propose un plugin gratuit pour déployer des certificats SSL pour vos applications. Ne vous laissez pas embrumer par les addons payants (dont Heroku fait aussi la pub d’ailleurs), vous n’en avez pas besoin. Plus de détails ici : Announcing Heroku Free SSL Beta and Flexible Dyno Hours.

On va donc activer celui-ci et configurer votre application pour qu’elle soit capable de recevoir vos certificats fraîchement générés.

Maintenant vous avez 2 alternatives, une en ligne de commande que je n’ai pas encore réussie à provisionner correctement, ou une via la GUI de Heroku. On va opter pour cette option de facilité. Voilà comment procéder :

Heroku Setup SSL official demo

Si vous ne voyez pas cette option, c’est que vous êtes sur un dyno gratuit. Heroku sont sympas mais ne font pas non plus dans la charité (légitime), il faut avoir un dyno payant (à partir de 7$/mois) pour disposer de l’option.

La GUI de Heroku est on ne peut plus claire sur la façon d’ajouter des certificats. Je vous laisse suivre le process comme expliqué.

Bon à savoir : le “public cert” correspond au contenu du fichier généré “fullchain.pem” et la “private key” au contenu de “privkey.pem”. Ne tenez pas compte des extensions suggérées ou communément utilisées.


OVH ou tout autre fournisseur de noms de domaines

Généralement, ils vous fournissent une interface pour gérer vos zones DNS. Mettez à jour vos adresses pour qu’elles suivent cette logique :


www IN CNAME www.mondomaine.fr.herokudns.com.

Attendez un peu le temps que ça se propage sur l’internet mondial.


Voilà votre site est sécurisé.


Renouveler un certificat

Il est censé être simple de renouveler un certificat HTTPS dans le système Let’s Encrypt. Cependant, il faut disposer des fichiers certificats originaux.

Si vous n’en disposez pas ou n’avez pas envie de fouiller la documentation pour comprendre comment faire, sachez que recréer un certificat de zéro marche aussi.

Quelques suggestions :

  • Forcez la redirection systématique de HTTP vers HTTPS ;
  • Ajoutez une entête “STS”, voir sur MDN ;
  • Retirer les pages du challenge ACME.

Bon à savoir : les certificats de Let’s Encrypt ne sont valables que 3 mois. Normalement la procédure de renouvellement est assez simple. Prenez y vous un peu à l’avance pour ne pas vous faire surprendre. Elle nécessite cependant de désactiver provisoirement la redirection automatique de HTTP vers HTTPS (et donc l’en-tête STS).