Installer un certificat Let's Encrypt
Ça fait une paie que je n’ai pas sorti un truc un peu plus geek, mais je me suis dit que ça pourrait me faire un pense-bête si je vous expliquais un peu comment j’ai fini par mettre en place ma demande de certificat Let’s Encrypt. Pour ceux que ça intéresse, ça fera un début et ça passera le temps en attendant que ça sorte de beta.
Une paire de choses d’abord : Je vise ici ceux qui bidouillent. Let’s Encrypt fournit un client pour tout faire à votre place qui vous conviendra peut-être, mais il doit avoir tous les droits sur votre serveur, c’est difficile de comprendre exactement ce qu’il fait, et moi j’aime bien comprendre ce qui se passe. comme en plus mes serveurs sont parfois bizarres, j’opte pour une procédure plus manuelle.
Je pose comme pré-requis que vous savez configurer votre serveur Apache/Nginx/autre. Je donnerai quelques exemples sur une config Apache, qui est ce que j’ai utilisé. Oui, ça veux dire mettre les mains dans le cambouis, mais ce n’est pas par manque de désir de simplifications : il FAUT modifier la config du serveur pour installer un certificat. De toutes façons, je parle de l’obtention/renouvellement du certificat, avec juste un minimum sur la config du serveur ensuite.
Vous aurez besoin :
- d’une clef privée pour vous identifier.
- d’une clef privée pour identifier le serveur.
- d’une demande de certificat pour votre (vos) domaine(s).
- d’une copie du certificat de Let’s Encrypt
Je vais donner des noms significatifs aux fichiers, mais vous donnez les noms que vous voulez.
Création des clefs privées
openssl genrsa 4096 > clef_privee_perso.key
openssl genrsa 4096 > clef_privee_machine.key
C’est à peu près tout. La première servira d’identifiant chez Let’s Encrypt. La seconde servira à signer votre demande de certificat, et ensuite à vérifier lors de son utilisation qu’on est sur la bonne machine.
Règle d’hygiène de base en matière de clefs : elles sont super importantes. Ne les perdez pas, ne les laissez pas traîner à un endroit où elles seraient accessibles à tout le monde.
Création de la demande de certificat
Vous allez créer un Certificate Signing Request (CSR) pour dialoguer avec Let’s Encrypt. Voyez ça comme un formulaire à remplir. Double avantage : il n’y a pas de risque d’incompréhension, et surtout le même formulaire servira pour -et on verra l’intérêt- le renouvellement (la commande est en un seule ligne) :
openssl req -new -sha256 -key clef_privee_machine.key -subj “/” -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf “[SAN]\nsubjectAltName=DNS:tonsite.com,DNS:www.tonsite.com”)) > formulaire_de_demande.csr[1]
Il y a une façon légèrement plus simple de faire si on n’a qu’un domaine[2], mais si on a le www, ou d’autres sous domaines, il vaut mieux tout faire d’un coup. Remplacez ce qu’il faut dans la ligne au dessus par DNS:url.du.site.com, séparés par des virgules, et sans espace[3].
Certificat intermédiaire
Souvent ça marchera sans, mais il peut y avoir un avertissement en fonction de la configuration. Il est donc préférable d’avoir sur son serveur une copie du certificat de Let’s Encrypt, histoire d’éviter à votre machine d’aller le chercher à chaque fois qu’elle en a besoin. Il est là :
https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem
Préparation du serveur
Lorsque vous faites la demande de certificat, il y a un dialogue entre Let’s Encrypt et votre serveur. En gros, vous donnez le formulaire avec la liste des domaines pour lesquels vous voulez un certificat, et pour chaque, Let’s Encrypt vous envoie un jeton (token) qui doit être accessible sur votre site web à une adresse précise avant que la transaction continue, c’est pour prouver qu’il s’agit bien de votre domaine.
Vous devez préparer à l’avance le répertoire où déposer ces jetons. Il doit être accessible à l’adresse suivante sur votre site : http://tonsite/.well-known/acme-challenge/
Demande de certificat
Let’s Encrypt a fourni un client pour ça, mais j’ai trouvé le truc un peu lourdingue à mon goût. En fouillant un peu, je suis tombé sur plusieurs autres solutions dont ça : acme_tiny. Ça fait moins de 200 lignes, c’est facile à auditer, et ça ne demande pas de droits bizarres[4], c’est vous qui vous débrouillez derrière. La commande est simple (et est également en un seule ligne) :
python acme_tiny.py —account-key ./clef_privee_perso.key —csr ./formulaire_de_demande.csr —acme-dir /var/www/site/.well-known/acme-challenge/ > ./certificat-domaines.pem
(ce qu’il y a derrière acme-dir, c’est évidemment le répertoire qui sera accessible publiquement)
Si tout se passe bien, le script va initier le dialogue avec Let’s Encrypt, recevoir les jetons, les créer dans le répertoire, vérifier qu’ils sont accessibles par http, prévenir Let’s Encrypt qu’il peut vérifier et signer le certificat, et supprimer les jetons quand il a fini.
Installation du certificat
Un fois que vous avez le certificat, il suffit de créer des vhosts sur le port 443 dans votre serveur web, pour lequel vous devez indiquer le chemin du certificat, de celui de Let’s Encrypt que vous avez téléchargé plus tôt, et de la clef privée du serveur. Un exemple minimal sous Apache, avec un exemple des chemins pour les différents fichiers[5] :
<VirtualHost *:443> ServerName tonsite.net ServerAlias www.tonsite.net SSLEngine on SSLCertificateFile /etc/ssl/certs/certificat-domaines.pem SSLCertificateChainFile /etc/ssl/certs/lets-encrypt-x1-cross-signed.pem SSLCertificateKeyFile /etc/ssl/private/clef_privee_machine.key DocumentRoot /var/www/ </VirtualHost>
Notez que de ce que je sais, il n’y a pas d’équivalent à SSLCertificateChainFile sur Nginx, il faut concaténer la chaîne des certificats et fournir celle-ci :
cat certificat-domaines.pem lets-encrypt-x1-cross-signed.pem > certificat-complet-a-utiliser.pem
Renouvellement du certificat
Un petit détail à connaître sur les certificats Let’s Encrypt : ils ont une durée de vie de trois mois. On aura donc tout intérêt à simplifier la procédure, parce que sinon, ça risque d’être un peu lourd très vite. La bonne nouvelle, c’est que vous pouvez tout simplement réutiliser le même formulaire à chaque fois. Si vous avez suivi les instructions ci-dessus, il suffit de relancer exactement la même ligne de commande qu’à la rubrique “demande de certificat”. C’est facile à ranger dans un cron, par exemple.
Et puis après ?
Après, tout ça est une base de travail. Ça peut fonctionner simplement comme ça, ou vous pouvez être psychop^H^H^H^H^H^H^H^H perfectionniste en gérant vos répertoires par alias, en les rendant inaccessibles pour qui ne sait pas le nom des jetons, en faisant des redirections vers un (sous) domaines spécialisé (ça marche), en redirigeant vos pages vers la version sécurisée, et surtout en bidouillant la config ssl aux petits oignons pour plus de sécurité (et avoir une bonne note chez ssllabs), mais nous ne sommes ici que pour les briques de base.
Voilà. C’est du pense-bête pour moi, donc je ne sais pas si c’est clair. On peut en discuter, je peux même faire des modifs, si c’est nécessaire. Lâche tes coms.
Notes
[1] Je pourrais expliquer exactement cette commande, mais il faudrait un autre billet. Il y a d’autres façons de faire, que je fouille.
[2] Pour être complet : openssl req -new -sha256 -key domain.key -subj “/CN=tonsite.com” > formulaire_de_demande.csr
[3] Attention, pendant la béta de Let’s Encrypt, on n’a droit qu’à cinq certificats par domaine (sous domaines inclus) par semaine. Pour le moment, je ne peux plus rien tester : j’ai dépassé mes quotas.
[4] Added bonus : les exemples qu’ils donnent, eux, sont pour Nginx, pour ceux que ça intéresse.
[5] Je suis preneur de toute commentaire quant à la pertinence de ces chemins)
Publié le 08/12/15, dans la rubrique nateurs et découvertes.
Commentaires
1. Par doublenain, le 10/12/2015 à 16:18
2. Par xave, le 10/12/2015 à 16:23
3. Par doublenain, le 10/12/2015 à 16:33
4. Par maggick, le 12/12/2015 à 23:31
5. Par xave, le 13/12/2015 à 11:36
6. Par Adrien, le 16/12/2015 à 02:04
7. Par stombi, le 24/12/2015 à 12:11
8. Par unknown, le 26/09/2016 à 17:12
9. Par xave, le 26/09/2016 à 17:21
10. Par unknown, le 27/09/2016 à 10:27
11. Par xave, le 27/09/2016 à 10:47
12. Par unknown, le 27/09/2016 à 12:17
13. Par unknown, le 27/09/2016 à 15:41
14. Par unknown, le 27/09/2016 à 15:45
15. Par unkown, le 29/09/2016 à 10:45
16. Par Pinkilla, le 03/05/2017 à 10:48
17. Par xave, le 03/05/2017 à 19:11
18. Par Mathieu, le 17/06/2017 à 23:33
19. Par xave, le 18/06/2017 à 10:55
20. Par Mathieu, le 18/06/2017 à 11:58