wiki/HowtoAcme.sh.md

313 lines
11 KiB
Markdown
Raw Permalink Normal View History

2021-10-26 11:05:20 +02:00
---
title: Howto acme.sh
categories: ssl
...
2021-10-26 11:08:06 +02:00
acme.sh est un client pour les autorités de certificats SSL/TLS qui utilisent le protocole ACME. Il est écrit entièrement en shell (compatible Bash, Dash et shell POSIX), donc compatible avec un très grand nombre de systèmes dexploitation et environnements dexécution.
2021-10-26 11:05:20 +02:00
2021-10-26 11:19:32 +02:00
* Documentation: <https://wiki.acme.sh>
2021-10-26 11:05:20 +02:00
2021-10-27 14:25:52 +02:00
## Installation et configuration
2021-10-26 11:05:20 +02:00
### Installation initiale
2021-10-26 13:19:55 +02:00
Acme.sh dépend de quelques composants de base : `apt install openssl cron socat curl`.
2021-10-26 11:08:06 +02:00
Acme.sh dispose de son propre mécanisme dinstallation. Dans son fonctionnement par défaut il installe tout dans un dossier `~/.acme.sh` mais il est possible de linstaller de manière personnalisée.
Nous recommandons de linstaller de manière globale, pour lutiliser comme Certbot.
2021-10-26 11:05:20 +02:00
~~~
# git clone https://github.com/acmesh-official/acme.sh.git
# cd acme.sh
# ./acme.sh --install \
--home /usr/local/lib/acme.sh \
--config-home /etc/acme.sh
~~~
2021-10-26 11:08:06 +02:00
Il faut ensuite ajuster la configuration générale pour le shell dans `/etc/acme.sh/acme.sh.env`:
2021-10-26 11:05:20 +02:00
~~~{.bash}
export LE_WORKING_DIR="/usr/local/lib/acme.sh"
export LE_CONFIG_HOME="/etc/acme.sh"
alias acme.sh="/usr/local/lib/acme.sh/acme.sh --config-home '/etc/acme.sh'"
~~~
2021-10-26 11:08:06 +02:00
Il faut enfin que votre environnement charge ce fichier de configuration:
2021-10-26 11:05:20 +02:00
~~~
2021-10-26 11:08:06 +02:00
# echo '. "/etc/acme.sh/acme.sh.env"' >> ~/.bashrc
2021-10-26 11:05:20 +02:00
~~~
2021-11-09 07:35:28 +01:00
Pour une exécution automatique régulière, vous pouvez ajouter une tâche dans `/etc/cron.d/acme-sh` (attention, pas de `.` dans les noms de tâches cron, sinon elles ne sont pas exécutées) :
~~~
33 0 * * * root "/usr/local/lib/acme.sh/acme.sh" --cron --home "/usr/local/lib/acme.sh" --config-home "/etc/acme.sh" --syslog 3 --no-color > /dev/null
~~~
2021-10-26 11:05:20 +02:00
### Challenge http-01
2021-10-26 11:08:06 +02:00
le plus souvent on utilise un challenge `http-01` qui consiste à créer un fichier spécial dans le filesystem et indiquer son emplacement à lautorité de certification, pour quelle puisse vérifier quon a le contrôle du domaine.
2021-10-26 11:05:20 +02:00
Le challenge utilise des URL normalisées du type `/.well-known/acme-challenge/XYZ`.
2021-10-26 11:08:06 +02:00
Nous allons stocker ces fichiers de challenge dans `/var/www/html/.well-known/acme-challenge`. Il faut donc que ce dossier existe et quil soit accessible en lecture par le serveur web:
2021-10-26 11:05:20 +02:00
~~~
# mkdir -p /var/www/html/.well-known/acme-challenge
# chmod -R u+rwX,go+rX,go-w /var/www/html/.well-known/acme-challenge
~~~
#### Apache
2021-10-26 11:08:06 +02:00
Pour Apache, on peut créer un fichier `/etc/apache2/conf-available/acme-challenge.conf`:
2021-10-26 11:05:20 +02:00
~~~{.apache}
Alias /.well-known/acme-challenge /var/www/html/.well-known/acme-challenge
<Directory "/var/www/html/.well-known/acme-challenge">
Options -Indexes
Require all granted
</Directory>
~~~
2021-10-26 11:08:06 +02:00
On active cette configuration:
2021-10-26 11:05:20 +02:00
~~~
# a2enconf acme-challenge
# systemctl reload apache2
~~~
#### Nginx
2021-10-26 11:08:06 +02:00
La configuration peut être placée dans `/etc/nginx/snippets/acme-challenge.conf`:
2021-10-26 11:05:20 +02:00
~~~{.nginx}
location ~ /.well-known/acme-challenge {
alias /var/www/html/;
try_files $uri =404;
auth_basic off;
allow all;
}
~~~
2021-10-26 11:08:06 +02:00
Il faut ensuite inclure cette configuration dans le fichier de configuration des sites, par exemple:
2021-10-26 11:05:20 +02:00
~~~{.nginx}
server {
server_name www.example.com;
[…]
include /etc/nginx/snippets/acme-challenge.conf;
[…]
}
~~~
### Autorités de certification
2021-10-26 11:08:06 +02:00
Acme.sh supporte plusieurs autorités de certifications:
2021-10-26 11:05:20 +02:00
* ZeroSSL.com CA (choix par défaut)
* Letsencrypt.org
* BuyPass.com
* SSL.com
* Pebble (strict Mode)
* autres CA compatibles RFC8555
2021-10-26 11:08:06 +02:00
Il est possible de choisir son autorité à chaque certificat, ou bien globalement. Par exemple, pour avoir Let's Encrypt par défaut: `acme.sh --set-default-ca --server letsencrypt`
2021-10-26 11:05:20 +02:00
2021-10-26 11:08:06 +02:00
## Génération dun certificat
2021-10-26 11:05:20 +02:00
## Options générales
2021-10-26 11:08:06 +02:00
On peut spécifier le ou les domaines à inclure dans le certificat en utilisant une ou plusieurs options `--domain` (ou `-d`):
2021-10-26 11:05:20 +02:00
~~~
# acme.sh --issue --domain www.example.com […]
# acme.sh --issue --domain www.example.com --domain example.com […]
~~~
2021-10-26 11:08:06 +02:00
On peut spécifier lautorité de certification souhaitée (indépendamment de la configuration générale):
2021-10-26 11:05:20 +02:00
~~~
# acme.sh --issue --domain www.example.com --server zerossl […]
~~~
2021-10-26 11:08:06 +02:00
Pour des tests on peut utiliser les options `--staging` ou `--test`. Pour Let's Encrypt, ça permet dutiliser leur serveur de "staging" sur lequel les quotas sont bien plus élevés (et éviter de se faire bannir en cas derreurs répétées), en contre-partie dun certificat qui ne sera pas reconnu.
2021-10-26 11:05:20 +02:00
### Challenge http-01
2021-10-26 11:08:06 +02:00
Pour générer un certificat simple pour "www.example.com" avec un challenge `http-01` il faut indiquer le paramètre `--webroot`:
2021-10-26 11:05:20 +02:00
~~~
# umask 022
# acme.sh --issue --domain www.example.com --webroot /var/www/html
~~~
2021-10-26 11:08:06 +02:00
> NB: la commande umask permet dassurer que le fichier de challenge sera accessible à tout le monde en lecture (donc au serveur web).
2021-10-26 11:05:20 +02:00
### Challenge dns-01
2021-11-04 12:00:02 +01:00
Ce type de challenge est particulièrement utile quand le domaine nest pas accessible en HTTP.
Il est même le seul moyen possible pour créer un certificat « wildcard ».
Le challenge DNS se fait soit en manuel/interactif (acme.sh nous donne les instructions et attend quon indique que lenregistrement DNS est en place), soit en mode automatique (en utilisant lAPI du gestionnaire de la zone DNS).
#### Challenge DNS manuel
Voir <https://github.com/acmesh-official/acme.sh/wiki/DNS-manual-mode>
Cette procédure est à éviter autant que possible, car elle force à refaire lopération au plus tard tous les 3mois.
En revanche elle est pratique pour un certificat temporaire, en attendant que le mode DNS automatique ou un lemode http-01 soit possible.
~~~
# acme.sh --issue --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --domain example.com
~~~
Le processus va se dérouler jusquà afficher les informations à ajouter dans la zone DNS:
~~~
Domain: '_acme-challenge.example.com'
TXT value: '3TFLt28SkxlU4fzktKqPCpE2-fLLaKEfeZCXdklD_GY
~~~
Une fois cet enregistrement ajouté dans votre zone et vérifié que les serveurs autoritaires renvoient bien linfo, on peut demander un renouvellement du certificat:
~~~
# acme.sh --renew --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --domain example.com
~~~
#### Challenge DNS automatique
Ce mode utilise lAPI du gestionnaire de la zone DNS pour y insérer un enregistrement de challenge.
La procédure est légèrement différente pour chaque gestionnaire.
##### Gandi LiveDNS
Il faut [obtenir une clé dAPI](https://doc.livedns.gandi.net/).
Pour chaque certificat à créer de cette manière il faut exporter les accréditations:
~~~
# export GANDI_LIVEDNS_KEY="your key"
~~~
… puis demander la création du certificat:
~~~
# acme.sh --issue --dns dns_gandi_livedns --domain example.com --domain www.example.com
~~~
##### OVH/Kimsufi/SoYouStart
Sur votre compte OVH il faut [créer une «application»](https://eu.api.ovh.com/createApp/) qui vous donnera une «clé dapplication» et un «secret dapplication».
Pour chaque certificat à créer de cette manière il faut exporter les accréditations:
~~~
# export OVH_AK="your application key"
# export OVH_AS="your application secret"
~~~
… puis demander la création du certificat:
~~~
# acme.sh --issue --dns dns_ovh --domain example.com --domain www.example.com
~~~
À la première invocation, il y aura une erreur qui indiquera quil faut authentifier lapplication.
~~~
Using OVH endpoint: ovh-eu
OVH consumer key is empty, Let's get one:
Please open this link to do authentication: https://eu.api.ovh.com/auth/?credentialToken=n0Qbjm6wBdBr2KiSqIuYSEnixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Here is a guide for you: https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
Please retry after the authentication is done.
Error add txt for domain:_acme-challenge.example.com
~~~
Il faut simplement cliquer sur le lien indiqué: https://eu.api.ovh.com/auth/?credentialToken=n0Qbjm6wBdBr2KiSqIuYSEnixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
On peut alors relancer la commande de création du certificat.
2021-10-26 11:05:20 +02:00
2021-10-27 14:25:52 +02:00
## Mise en œuvre des certificats
2021-10-26 11:05:20 +02:00
2021-10-27 14:25:52 +02:00
Lors de la génération dun certificat, les fichiers de base sont stockés dans une structure interne (susceptible de changer sans préavis). Il faut donc utiliser les fonctions de déploiements afin dinstaller les fichiers nécessaires.
2021-10-26 11:05:20 +02:00
2021-11-04 12:00:02 +01:00
Acme.sh propose 2 approches complémentaires pour la mise en œuvre des certificats: installation et déploiement.
2021-10-27 14:25:52 +02:00
### Installation locale
2021-11-04 12:00:02 +01:00
Cest le meilleur moyen de copier les fichiers de certificats dont on a besoin à un emplacement prévu et de recharger le service associé.
2021-10-27 14:25:52 +02:00
Exemple pour un serveur web Apache local (voir <https://github.com/acmesh-official/acme.sh/wiki/Deploy-ssl-certs-to-apache-server>):
~~~
# acme.sh --install-cert --domain www.example.com --key-file /etc/apache2/ssl/www.example.com/privkey.pem --fullchain-file /etc/apache2/ssl/www.example.com/fullchain.pem --reloadcmd "systemctl reload apache2"
~~~
2021-11-04 12:00:02 +01:00
Notez que la configuration des VHosts pour utiliser le certificat n'est pas faite par acme.sh, il faut le faire soi-même.
2021-10-27 14:25:52 +02:00
### Scripts de déploiement
2021-11-04 12:00:02 +01:00
Acme.sh propose toute un catalogue de "hooks" qui peuvent être utilisés. Ils permettent dexécuter des séquences dactions beaucoup plus complexes. Voir <https://github.com/acmesh-official/acme.sh/wiki/deployhooks>.
2021-10-27 14:25:52 +02:00
Les hooks sont installés dans le dossier `/usr/local/lib/acme.sh/deploy`.
Il en existe un pour HAproxy qui se charge de concaténer les bons éléments et de les faire prendre en compte par HAProxy.
Il en existe aussi un pour copier les fichiers sur un ou plusieurs serveurs distants par SSH.
2021-11-04 12:00:02 +01:00
La configuration des hooks passe par des variables denvironnement.
2021-10-27 14:25:52 +02:00
~~~
# export DEPLOY_SSH_USER=me
# export DEPLOY_SSH_SERVER=1.2.3.4
# export DEPLOY_SSH_KEYFILE=/path/to/privkey.pem
# export DEPLOY_SSH_FULLCHAIN=/path/to/fullchain.pem
# acme.sh --deploy --domain www.example.com --deploy-hook ssh
~~~
2021-11-04 12:00:02 +01:00
Les commandes sont à exécuter une seule fois à la mise en œuvre dun certificat. Acme.sh se souvient des actions et les exécute toutes à nouveau lors des renouvelements, grace à la persistence de la configuration dans `/etc/acme.sh/www.example.com/www.example.com.conf`.
2021-10-26 11:05:20 +02:00
2021-10-26 11:08:06 +02:00
## Renouvellement dun certificat
2021-10-26 11:05:20 +02:00
_TODO_
## Notifications
Il est possible de configurer plusieurs systèmes de notification. Voir <https://github.com/acmesh-official/acme.sh/wiki/notify>
Par exemple, pour recevoir un mail à chaque exécution de renouvellement.
2021-10-26 11:08:06 +02:00
On ajoute ces lignes dans la configuration `/etc/acme.sh/acme.sh.env`:
2021-10-26 11:05:20 +02:00
~~~{.bash}
export MAIL_FROM="xxx@domain-from.com"
export MAIL_TO="yyy@domain-to.com"
~~~
2021-10-26 11:08:06 +02:00
Puis on joue la commande de configuration: `acme.sh --set-notify --notify-hook mail --notify-mode 0 --notify-level 1`
2021-10-26 11:05:20 +02:00
## Autres commandes
### Liste des certificats
~~~
# acme.sh --list
Main_Domain KeyLength SAN_Domains CA Created Renew
www.example.com "" no LetsEncrypt.org Wed 13 Oct 2021 07:37:59 PM UTC Sun 12 Dec 2021 07:37:59 PM UTC
~~~
### Mise à jour
2021-10-26 11:08:06 +02:00
Il est possible de mettre à jour acme.sh ponctuellement: `acme.sh --upgrade`
2021-10-26 11:05:20 +02:00
2021-10-26 11:08:06 +02:00
… ou automatiquement (déclenché par le cron de renouvellement): `acme.sh --upgrade --auto-upgrade`
2021-10-26 11:05:20 +02:00
2021-10-26 11:08:06 +02:00
On peut plus tard désactiver les mises à jour automatiques: `acme.sh --upgrade --auto-upgrade 0`
2021-10-26 11:05:20 +02:00
### Désinstallation
~~~
# acme.sh --uninstall
~~~