« Letsencrypt » : différence entre les versions
m (→Génération : Suppression d'un espace en trop dans la commande.) |
(Ajout de ACME.sh et remplacement des balises sources obsolètes par syntaxhighlight + corrections de l'introduction) |
||
Ligne 1 : | Ligne 1 : | ||
[[Category: | [[Category:X.509]] | ||
[https://fr.wikipedia.org/wiki/Let%27s_Encrypt Letsencrypt] est une autorité de certification lancée le 3 décembre 2015 (Bêta Version Publique). Elle permet de générer des certificats X.509 gratuitement et sans limite de nombre. | [https://fr.wikipedia.org/wiki/Let%27s_Encrypt Letsencrypt] est une [https://fr.wikipedia.org/wiki/Autorit%C3%A9_de_certification autorité de certification] lancée le 3 décembre 2015 (Bêta Version Publique). Elle permet de générer des certificats [[:Category:X.509|X.509]] gratuitement et sans limite de nombre. | ||
C'est un service fourni par | C'est un service fourni par l{{'}}''Internet Security Research Group'' (''ISRG''). Les mécènes principaux sont l{{'}}''Electronic Frontier Foundation'' (''EFF''), la Fondation ''Mozilla'', ''Akamai'', ''Cisco Systems'' , ''PlanetHoster'' et ''OVH''. D'autres partenaires, tels que l'autorité de certification ''IdenTrust'', l'Université du Michigan (''U-M''), la ''Stanford Law School'', la Fondation ''Linux'', l'entreprise ''Free10'', ainsi que ''Stephen Kent'' de ''Raytheon / BBN Technologies'' et ''Alex Polvi'' de ''CoreOS'' sont également impliqués dans le projet. Bref c'est un truc sérieux et cela représente tout de même 51,21% des certificats ''TLS'' en avril 2018 d'après ''NetTrack''. | ||
L{{'}}autorité de certification se base sur le protocole ''Automatic Certificate Management Environment'' (''ACME'' ou "environnement de gestion automatique de certificat") permettant l{{'}}automatisation des échanges entre les autorités de certification et les administrateurs de serveurs, rendant ainsi possible le déploiement automatisé d’une infrastructure à clé publique à très bas coût. Plusieurs implémentations de ce protocole existent. | |||
=Génération de certificats= | =ACME.sh= | ||
[https://github.com/acmesh-official/acme.sh ACME.sh] est une implémentation libre (''GPL v3.0'') du protocole idoine écrite en [[Script bash|langage Shell]]. Elle a le gros avantage d'être très légère en déploiement et en usage. Cet outil fonctionne avec un seul script (ses dépendances se trouvent dans le répertoire livré avec) et s'utilise en une seule commande sans rien installer. | |||
==Usage== | |||
Téléchargement de l'outil | |||
export VERSION_ACME="3.0.4" | |||
wget https://github.com/acmesh-official/acme.sh/archive/refs/tags/"${VERSION_ACME}".tar.gz -qO - | tar -xvz -C /tmp/ && cp -av /tmp/acme.sh-"${VERSION_ACME}" /opt/ | |||
ln -vs /opt/acme.sh-"${VERSION_ACME}" /opt/acme.sh | |||
Afin de ne pas nécessiter d'intervention manuelle, il est possible de créer une clé ''API'' auprès de nombreux [https://github.com/acmesh-official/acme.sh/wiki/dnsapi registres DNS]. Celle-ci permet au logiciel d'ajouter automatiquement un champ ''TXT'' servant à authentifier la légitimité de la requête. | |||
Génération d'un certificat simple | |||
<syntaxhighlight lang="bash"> | |||
GANDI_LIVEDNS_KEY="INSEREZ_VOTRE_CLEF_API" /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d test.ycharbi.fr --dns dns_gandi_livedns --force | |||
</syntaxhighlight> | |||
{{info|Un répertoire <syntaxhighlight lang="bash" inline>~/.acme.sh/</syntaxhighlight> est automatiquement créé et contiendra l'ensemble des certificats et clés gérés. Pensez à y faire un ménage régulier car les certificats générés ne sont valides que 3 mois. La régénération d'un certificat pour un même ''FQDN'' remplace le précédent.}} | |||
Vous pouvez afficher le contenu de vos certificats (notamment la validité) via la commande | |||
openssl x509 -noout -text -in ~/.acme.sh/test.ycharbi.fr_ecc/fullchain.cer | |||
==Automatisation== | |||
Dans la mesure où les certificats ont une validité de 3 mois et au vu de l’importance de les maintenir à jour, il est recommandé d'automatiser leur renouvellement. Voici un script permettant de générer un certificat valide pour tous les sous-domaines (joker) de ''ycharbi.fr''. Le résultat est mis, tant en forme qu'à disposition de [[Haproxy|HAProxy]] avant un rechargement de son service. | |||
{{attention|La méthode pour renseigner la clé ''API'' peut varier d'un registre à un autre. référez-vous à la [https://github.com/acmesh-official/acme.sh/wiki/dnsapi documentation] pour adapter le script à votre fournisseur. L'exemple ci-dessous est valide pour les ''DNS'' de [https://gandi.net Gandi].}} | |||
===Script de génération=== | |||
<syntaxhighlight lang="php"> | |||
cat << '_EOF_' > /usr/local/sbin/genX509.sh | |||
#!/bin/bash | |||
CLEF_API_DNS="INSEREZ_VOTRE_CLEF_API" | |||
DOMAINE="ycharbi.fr" | |||
CHEMIN_DST="/root/letsencrypt/" | |||
HAPROXY_TLS_DST="/etc/haproxy/tls/" | |||
mkdir -p /"${CHEMIN_DST}"/"${DOMAINE}"/ | |||
GANDI_LIVEDNS_KEY="${CLEF_API_DNS}" /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d "*.${DOMAINE}" --dns dns_gandi_livedns --cert-file /root/letsencrypt/"${DOMAINE}"/"${DOMAINE}".crt --key-file /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}".key --fullchain-file /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}"-full.crt --force --reloadcmd "cat /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}"-full.crt /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}".key > /"${HAPROXY_TLS_DST}"/"${DOMAINE}".pem && systemctl reload haproxy.service" | |||
_EOF_ | |||
</syntaxhighlight> | |||
chmod +x /usr/local/sbin/genX509.sh | |||
{{info|En précisant la destination des fichiers à générer, ceux-ci se trouveront à la fois dans le répertoire voulu ainsi que dans le <syntaxhighlight lang="bash" inline>~/.acme.sh/</syntaxhighlight> de d'habitude.}} | |||
===Automatisation de la tâche=== | |||
Afin d'exécuter le script automatiquement, divers outils peuvent êtres utilisés comme [[Cron]] ou les [[Minuteur - systemd|minuteurs Systemd]]. Je recommande cette dernière solution pour des raisons de fiabilité et de facilité de supervision. | |||
mkdir -p /usr/local/etc/systemd/system | |||
<syntaxhighlight lang="ini"> | |||
cat << _EOF_ > /usr/local/etc/systemd/system/genX509.service | |||
[Unit] | |||
Description=Génération du certificat joker pour les sous-domaines d'ycharbi.fr | |||
After=network.target | |||
[Service] | |||
Type=oneshot | |||
ExecStart=genX509.sh | |||
RemainAfterExit=yes | |||
[Install] | |||
WantedBy=multi-user.target | |||
_EOF_ | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="ini"> | |||
cat << _EOF_ > /usr/local/etc/systemd/system/genX509.timer | |||
[Unit] | |||
Description=Exécution mensuelle de la génération du certificat joker pour les sous-domaines d'ycharbi.fr | |||
[Timer] | |||
OnCalendar=monthly | |||
Persistent=true | |||
[Install] | |||
WantedBy=timers.target | |||
_EOF_ | |||
</syntaxhighlight> | |||
ln -s /usr/local/etc/systemd/system/genX509.service /etc/systemd/system/ | |||
ln -s /usr/local/etc/systemd/system/genX509.timer /etc/systemd/system/ | |||
systemctl daemon-reload | |||
systemctl enable genX509.timer | |||
systemctl start genX509.timer | |||
Les informations sur la prochaine exécution sont visualisables avec la commande | |||
systemctl status genX509.timer | |||
=Certbot= | |||
Cette section traite de l'outil historique bien trop lourd à mon goût. Je ne l'utilise plus car il impose trop de contraintes et peut être remplacé sans difficultés par plus simple. Ne sera abordé que la génération de certificats sans la partie automatisation. | |||
==Génération de certificats== | |||
Il existe différents modes de génération de certificats. Voici ceux que j'utilise avec l'outil ''certbot''. | Il existe différents modes de génération de certificats. Voici ceux que j'utilise avec l'outil ''certbot''. | ||
==Mode autonome== | ===Mode autonome=== | ||
Ce mode permet de récupérer un certificat signé directement sur une machine proposant un service WEB (les commande seront à effectuées sur la machine répondant au domaine). | Ce mode permet de récupérer un certificat signé directement sur une machine proposant un service WEB (les commande seront à effectuées sur la machine répondant au domaine). | ||
{{attention|Cette méthode installe tout un tas de bordel sur la machine dont un serveur [[Apache]]. Pour ma part, je lance une machine dédiée (un [[Squashfs]] dans mon cas), qui se chargera de la génération des certificats que je récupèrent et transferts sur la machine de destination (opération lourde destinée principalement à des tests).}} | {{attention|Cette méthode installe tout un tas de bordel sur la machine dont un serveur [[Apache]]. Pour ma part, je lance une machine dédiée (un [[Squashfs]] dans mon cas), qui se chargera de la génération des certificats que je récupèrent et transferts sur la machine de destination (opération lourde destinée principalement à des tests).}} | ||
===Installation=== | ====Installation==== | ||
apt install python-certbot-apache | apt install python-certbot-apache | ||
===Génération=== | ====Génération==== | ||
Il faut que le domaine à signé dirige les requêtes vers l'adresse IP de la machine ''certbot'' sinon l'erreur 503 renvoyé par celui-ci et interrompra la procédure. | Il faut que le domaine à signé dirige les requêtes vers l'adresse IP de la machine ''certbot'' sinon l'erreur 503 renvoyé par celui-ci et interrompra la procédure. | ||
Ligne 37 : | Ligne 132 : | ||
cat /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem > /etc/ssl/tube.ycharbi.fr.pem | cat /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem > /etc/ssl/tube.ycharbi.fr.pem | ||
===Source de la section=== | ====Source de la section==== | ||
* https://community.letsencrypt.org/t/solution-client-with-the-currently-selected-authenticator-does-not-support-any-combination-of-challenges-that-will-satisfy-the-ca/49983 | * https://community.letsencrypt.org/t/solution-client-with-the-currently-selected-authenticator-does-not-support-any-combination-of-challenges-that-will-satisfy-the-ca/49983 | ||
==Mode manuel== | ===Mode manuel=== | ||
Cette méthode permet de générer des certificat joker (wildcard). Selon moi, elle est beaucoup plus propre et n'installe pas tout un tas de paquets sur la machine. Elle peut être utilisée depuis une machine qui n'héberge aucun services (je l'utilise personnellement depuis mon proxy inverse). | Cette méthode permet de générer des certificat joker (''wildcard''). Selon moi, elle est beaucoup plus propre et n'installe pas tout un tas de paquets sur la machine. Elle peut être utilisée depuis une machine qui n'héberge aucun services (je l'utilise personnellement depuis mon proxy inverse). | ||
===Installation=== | ====Installation==== | ||
apt install certbot | apt install certbot | ||
===Génération=== | ====Génération==== | ||
certbot certonly --rsa-key-size 4096 --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.ycharbi.fr' | certbot certonly --rsa-key-size 4096 --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.ycharbi.fr' | ||
Il va poser une chiée de question et donner le nom et la valeur d'un champ TXT DNS à entrer dans la zone du domaine à signé (il s'agit d'une clé d'authentification pour le protocole ACMEv2). Une fois ce champ renseigné et appliqué dans la zone DNS, faire < | Il va poser une chiée de question et donner le nom et la valeur d'un champ TXT DNS à entrer dans la zone du domaine à signé (il s'agit d'une clé d'authentification pour le protocole ACMEv2). Une fois ce champ renseigné et appliqué dans la zone DNS, faire <syntaxhighlight lang="bash" inline><entrer></syntaxhighlight> au prompte pour récupérer le certificat ainsi que sa clef privée (disponibles dans <syntaxhighlight lang="bash" inline>/etc/letsencrypt/archive/ycharbi.fr</syntaxhighlight>). | ||
===Sources de la section=== | ====Sources de la section==== | ||
* https://blog.blaisot.org/letsencrypt-wildcard-part1.html | * https://blog.blaisot.org/letsencrypt-wildcard-part1.html | ||
* https://wiki.dureuil.info/doku.php/linux:cert-ssl-letsencrypt-wildcard-api-gandi-livedns | * https://wiki.dureuil.info/doku.php/linux:cert-ssl-letsencrypt-wildcard-api-gandi-livedns |
Version du 2 août 2022 à 15:31
Letsencrypt est une autorité de certification lancée le 3 décembre 2015 (Bêta Version Publique). Elle permet de générer des certificats X.509 gratuitement et sans limite de nombre.
C'est un service fourni par l'Internet Security Research Group (ISRG). Les mécènes principaux sont l'Electronic Frontier Foundation (EFF), la Fondation Mozilla, Akamai, Cisco Systems , PlanetHoster et OVH. D'autres partenaires, tels que l'autorité de certification IdenTrust, l'Université du Michigan (U-M), la Stanford Law School, la Fondation Linux, l'entreprise Free10, ainsi que Stephen Kent de Raytheon / BBN Technologies et Alex Polvi de CoreOS sont également impliqués dans le projet. Bref c'est un truc sérieux et cela représente tout de même 51,21% des certificats TLS en avril 2018 d'après NetTrack.
L'autorité de certification se base sur le protocole Automatic Certificate Management Environment (ACME ou "environnement de gestion automatique de certificat") permettant l'automatisation des échanges entre les autorités de certification et les administrateurs de serveurs, rendant ainsi possible le déploiement automatisé d’une infrastructure à clé publique à très bas coût. Plusieurs implémentations de ce protocole existent.
ACME.sh
ACME.sh est une implémentation libre (GPL v3.0) du protocole idoine écrite en langage Shell. Elle a le gros avantage d'être très légère en déploiement et en usage. Cet outil fonctionne avec un seul script (ses dépendances se trouvent dans le répertoire livré avec) et s'utilise en une seule commande sans rien installer.
Usage
Téléchargement de l'outil
export VERSION_ACME="3.0.4" wget https://github.com/acmesh-official/acme.sh/archive/refs/tags/"${VERSION_ACME}".tar.gz -qO - | tar -xvz -C /tmp/ && cp -av /tmp/acme.sh-"${VERSION_ACME}" /opt/ ln -vs /opt/acme.sh-"${VERSION_ACME}" /opt/acme.sh
Afin de ne pas nécessiter d'intervention manuelle, il est possible de créer une clé API auprès de nombreux registres DNS. Celle-ci permet au logiciel d'ajouter automatiquement un champ TXT servant à authentifier la légitimité de la requête.
Génération d'un certificat simple
GANDI_LIVEDNS_KEY="INSEREZ_VOTRE_CLEF_API" /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d test.ycharbi.fr --dns dns_gandi_livedns --force
INFORMATION
Un répertoire~/.acme.sh/
est automatiquement créé et contiendra l'ensemble des certificats et clés gérés. Pensez à y faire un ménage régulier car les certificats générés ne sont valides que 3 mois. La régénération d'un certificat pour un même FQDN remplace le précédent.Vous pouvez afficher le contenu de vos certificats (notamment la validité) via la commande
openssl x509 -noout -text -in ~/.acme.sh/test.ycharbi.fr_ecc/fullchain.cer
Automatisation
Dans la mesure où les certificats ont une validité de 3 mois et au vu de l’importance de les maintenir à jour, il est recommandé d'automatiser leur renouvellement. Voici un script permettant de générer un certificat valide pour tous les sous-domaines (joker) de ycharbi.fr. Le résultat est mis, tant en forme qu'à disposition de HAProxy avant un rechargement de son service.
ATTENTION
La méthode pour renseigner la clé API peut varier d'un registre à un autre. référez-vous à la documentation pour adapter le script à votre fournisseur. L'exemple ci-dessous est valide pour les DNS de Gandi.Script de génération
cat << '_EOF_' > /usr/local/sbin/genX509.sh
#!/bin/bash
CLEF_API_DNS="INSEREZ_VOTRE_CLEF_API"
DOMAINE="ycharbi.fr"
CHEMIN_DST="/root/letsencrypt/"
HAPROXY_TLS_DST="/etc/haproxy/tls/"
mkdir -p /"${CHEMIN_DST}"/"${DOMAINE}"/
GANDI_LIVEDNS_KEY="${CLEF_API_DNS}" /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d "*.${DOMAINE}" --dns dns_gandi_livedns --cert-file /root/letsencrypt/"${DOMAINE}"/"${DOMAINE}".crt --key-file /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}".key --fullchain-file /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}"-full.crt --force --reloadcmd "cat /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}"-full.crt /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}".key > /"${HAPROXY_TLS_DST}"/"${DOMAINE}".pem && systemctl reload haproxy.service"
_EOF_
chmod +x /usr/local/sbin/genX509.sh
INFORMATION
En précisant la destination des fichiers à générer, ceux-ci se trouveront à la fois dans le répertoire voulu ainsi que dans le~/.acme.sh/
de d'habitude.Automatisation de la tâche
Afin d'exécuter le script automatiquement, divers outils peuvent êtres utilisés comme Cron ou les minuteurs Systemd. Je recommande cette dernière solution pour des raisons de fiabilité et de facilité de supervision.
mkdir -p /usr/local/etc/systemd/system
cat << _EOF_ > /usr/local/etc/systemd/system/genX509.service
[Unit]
Description=Génération du certificat joker pour les sous-domaines d'ycharbi.fr
After=network.target
[Service]
Type=oneshot
ExecStart=genX509.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
_EOF_
cat << _EOF_ > /usr/local/etc/systemd/system/genX509.timer
[Unit]
Description=Exécution mensuelle de la génération du certificat joker pour les sous-domaines d'ycharbi.fr
[Timer]
OnCalendar=monthly
Persistent=true
[Install]
WantedBy=timers.target
_EOF_
ln -s /usr/local/etc/systemd/system/genX509.service /etc/systemd/system/ ln -s /usr/local/etc/systemd/system/genX509.timer /etc/systemd/system/
systemctl daemon-reload
systemctl enable genX509.timer systemctl start genX509.timer
Les informations sur la prochaine exécution sont visualisables avec la commande
systemctl status genX509.timer
Certbot
Cette section traite de l'outil historique bien trop lourd à mon goût. Je ne l'utilise plus car il impose trop de contraintes et peut être remplacé sans difficultés par plus simple. Ne sera abordé que la génération de certificats sans la partie automatisation.
Génération de certificats
Il existe différents modes de génération de certificats. Voici ceux que j'utilise avec l'outil certbot.
Mode autonome
Ce mode permet de récupérer un certificat signé directement sur une machine proposant un service WEB (les commande seront à effectuées sur la machine répondant au domaine).
ATTENTION
Cette méthode installe tout un tas de bordel sur la machine dont un serveur Apache. Pour ma part, je lance une machine dédiée (un Squashfs dans mon cas), qui se chargera de la génération des certificats que je récupèrent et transferts sur la machine de destination (opération lourde destinée principalement à des tests).Installation
apt install python-certbot-apache
Génération
Il faut que le domaine à signé dirige les requêtes vers l'adresse IP de la machine certbot sinon l'erreur 503 renvoyé par celui-ci et interrompra la procédure.
ASTUCE
Il est possible d'automatiser le remplissage du nom de domaine lié au certificat à générer si le paramètre "ServerName domaine.ycharbi.fr" est ajouté dans un vHost. La procédure de création d'un vHost HTTPS par certbot sera donc automatique (sinon il demande de taper le numéro correspondant au vHost affiché dans la liste qu'il a généré en regardant dans le répertoire sites-availables).Génération de certificat pour tube.ycharbi.fr
certbot --authenticator standalone --installer apache -d tube.ycharbi.fr --pre-hook "service apache2 stop" --post-hook "service apache2 start"
INFORMATION
Il va demander une adresse e-mail qui servira à prévenir de l'expiration imminente du certificat.Le résultat est stocké dans ces emplacements:
- Clé publique/certificat: /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem
- Clé privé: /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem
Il est bien sûr possible d'en faire un certificat chaîné pour certaines applications comme Haproxy par exemple:
cat /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem > /etc/ssl/tube.ycharbi.fr.pem
Source de la section
Mode manuel
Cette méthode permet de générer des certificat joker (wildcard). Selon moi, elle est beaucoup plus propre et n'installe pas tout un tas de paquets sur la machine. Elle peut être utilisée depuis une machine qui n'héberge aucun services (je l'utilise personnellement depuis mon proxy inverse).
Installation
apt install certbot
Génération
certbot certonly --rsa-key-size 4096 --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.ycharbi.fr'
Il va poser une chiée de question et donner le nom et la valeur d'un champ TXT DNS à entrer dans la zone du domaine à signé (il s'agit d'une clé d'authentification pour le protocole ACMEv2). Une fois ce champ renseigné et appliqué dans la zone DNS, faire <entrer>
au prompte pour récupérer le certificat ainsi que sa clef privée (disponibles dans /etc/letsencrypt/archive/ycharbi.fr
).