La version de production du server ACMEv2 de Let’s Encrypt est disponible depuis plusieurs semaines et il permet d’obtenir et d’installer des certificats SSL Wildcard pour sécuriser un domaine, ainsi que tous ses sous-domaine. Cela peut s’avérer particulièrement intéressant si vous héberger plusieurs sites sur des sous-domaines ou une instance WordPress Multi-sites. Dans cet article nous allons voir comment obtenir un certificat SSL Wildcard en utilisant notre client ACME favoris, Acme.sh avec une validation DNS manuelle puis automatisée avec Cloudflare.
Installer Acme.sh
Acme.sh s’installe facilement avec la commande suivante :
wget -O - https://get.acme.sh | sh
Après l’installation, vous pouvez utiliser la commande source ~/.bashrc
ou fermer puis ré-ouvrir votre session pour activer l’auto-complétion.
Obtenir un certificat SSL Let’s Encrypt Wildcard
Validation DNS manuelle
Les certificats SSL Wildcards de Let’s Encrypt supportent uniquement la validation avec un enregistrement DNS, en mode manuel il est donc nécessaire de lancer acme.sh, puis de copier/coller l’enregistrement affiché et d’ajouter un enregistrement DNS.
Attention, le mode « validation DNS manuelle » ne supporte pas le renouvellement automatique du certificat, son utilisation n’est pas recommandée en production comme l’indique la documentation acme.sh
La commande pour générer un certificat SSL Wildcard avec Acme.sh en mode DNS manuel est la suivante :
acme.sh --issue -d votredomaine.tld -d *.votredomaine.tld --dns
Mais s’agissant d’un mode de validation dont le renouvellement n’est pas automatique, il vous faudra ajouter l’argument --yes-I-know-dns-manual-mode-enough-go-ahead-please
pour confirmer qu’il s’agit bien du mode de validation souhaité et que vous connaissez son fonctionnement.
Vous pouvez également définir d’autres options, comme le type de certificat ou la taille de la clé privée. Par exemple pour un certificat ECDSA avec un clé privée de 384 bits, la commande sera :
acme.sh --issue -d votredomaine.tld -d *.votredomaine.tld --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --keylength ec-384
Acme.sh va générer la votre clé privée, ainsi que le CSR puis vous afficher les deux enregistrements DNS à ajouter :
root@vps:~# acme.sh --issue -d votredomaine.tld -d *.votredomaine.tld --dns --keylength ec-384 --yes-I-know-dns-manual-mode-enough-go-ahead-please
[lundi 19 mars 2018, 14:23:22 (UTC+0100)] Domains have changed.
[lundi 19 mars 2018, 14:23:22 (UTC+0100)] Multi domain='DNS:votredomaine.tld,DNS:*.votredomaine.tld'
[lundi 19 mars 2018, 14:23:23 (UTC+0100)] Getting domain auth token for each domain
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Getting webroot for domain='votredomaine.tld'
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Getting webroot for domain='*.votredomaine.tld'
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Add the following TXT record:
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Domain: '_acme-challenge.votredomaine.tld'
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] TXT value: 'TkcYtkbkvagdGG78YzLEdJF_JkV9GXtH8x-9f6nsM'
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Please be aware that you prepend _acme-challenge. before your domain
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] so the resulting subdomain will be: _acme-challenge.votredomaine.tld
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Add the following TXT record:
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Domain: '_acme-challenge.votredomaine.tld'
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] TXT value: '39boLncIG-2GWXx4GG8f6kgzDZAQrk_F7FwohnTE3Zo'
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Please be aware that you prepend _acme-challenge. before your domain
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] so the resulting subdomain will be: _acme-challenge.votredomaine.tld
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Please add the TXT records to the domains, and re-run with --renew.
[lundi 19 mars 2018, 14:23:24 (UTC+0100)] Please check log file for more details: /root/.acme.sh/acme.sh.log
Lors que vous aurez ajouté les deux enregistrements DNS sur votre domaine, vous pouvez lancer la phase de validation avec la commande :
acme.sh --renew -d votredomaine.tld --ecc --yes-I-know-dns-manual-mode-enough-go-ahead-please
L’option --ecc
est nécessaire uniquement si vous avez généré une clé privée ECC.
Si le challenge ACME est validé, Acme.sh vous affichera l’emplacement dans lequel est stocké votre certificat SSL et votre clé privée :
root@vps:~# acme.sh --renew --ecc -d votredomaine.tld --yes-I-know-dns-manual-mode-enough-go-ahead-please
[lundi 19 mars 2018, 14:27:45 (UTC+0100)] Renew: 'votredomaine.tld'
[lundi 19 mars 2018, 14:27:45 (UTC+0100)] Skip, Next renewal time is: mardi 1 mai 2018, 11:54:03 (UTC+0000)
[lundi 19 mars 2018, 14:27:45 (UTC+0100)] Add '--force' to force to renew.
root@nginx:~# acme.sh --renew --ecc -d votredomaine.tld --force
[lundi 19 mars 2018, 14:27:59 (UTC+0100)] Renew: 'votredomaine.tld'
[lundi 19 mars 2018, 14:28:00 (UTC+0100)] Multi domain='DNS:votredomaine.tld,DNS:*.votredomaine.tld'
[lundi 19 mars 2018, 14:28:00 (UTC+0100)] Getting domain auth token for each domain
[lundi 19 mars 2018, 14:28:00 (UTC+0100)] Verifying:votredomaine.tld
[lundi 19 mars 2018, 14:28:03 (UTC+0100)] Success
[lundi 19 mars 2018, 14:28:03 (UTC+0100)] Verifying:*.votredomaine.tld
[lundi 19 mars 2018, 14:28:06 (UTC+0100)] Success
[lundi 19 mars 2018, 14:28:06 (UTC+0100)] Verify finished, start to sign.
[lundi 19 mars 2018, 14:28:08 (UTC+0100)] Cert success.
[lundi 19 mars 2018, 14:28:08 (UTC+0100)] Your cert is in /root/.acme.sh/certs/votredomaine.tld_ecc/votredomaine.tld.cer
[lundi 19 mars 2018, 14:28:08 (UTC+0100)] Your cert key is in /root/.acme.sh/certs/votredomaine.tld_ecc/votredomaine.tld.key
[lundi 19 mars 2018, 14:28:08 (UTC+0100)] The intermediate CA cert is in /root/.acme.sh/certs/votredomaine.tld_ecc/ca.cer
[lundi 19 mars 2018, 14:28:08 (UTC+0100)] And the full chain certs is there: /root/.acme.sh/certs/votredomaine.tld_ecc/fullchain.cer
Validation avec l’API DNS de Cloudflare
Le mode manuel n’est pas particulièrement dur à utiliser, mais il ne permet pas de renouveler vos certificats SSL automatiquement, en plus d’être assez pénible à faire si vous avez un certain nombre de domaine. Heureusement Acme.sh permet d’utiliser les API de la plupart des services d’hébergement DNS, tel que Cloudflare, DigitalOcean, OVH ou AWS Route 53. Il suffit pour cela de définir vos identifiants d’API puis d’utiliser l’option associée à votre hébergeur DNS.
Dans notre exemple, nous avons utilisé Cloudflare, pour cela nous avons d’abord récupérer notre clé API dans notre compte Cloudflare > My Profile. Pour définir vos identifiants API avant de générer un certificat SSL il vous suffit de faire :
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="hi@acme.sh"
Vous pouvez alors passer à l’étape suivante, générer le certificat SSL Wildcard :
acme.sh --issue -d votredomaine.tld -d *.votredomaine.tld --dns dns_cf
De la même façon que précédemment, vous pouvez ajouter des options, notamment pour générer un clé privée ECC de 384 bits :
acme.sh --issue -d votredomaine.tld -d *.votredomaine.tld --dns dns_cf --keylength ec-384
Mais cette fois-ci, au lieu d’avoir à ajouter les enregistrements DNS manuellement, toute la procédure de validation est automatisée par Acme.sh :
root@vps:~# acme.sh --issue -d votredomaine.tld -d *.votredomaine.tld --dns dns_cf --keylength ec-384
[lundi 19 mars 2018, 14:58:08 (UTC+0100)] Multi domain='DNS:votredomaine.tld,DNS:*.votredomaine.tld'
[lundi 19 mars 2018, 14:58:08 (UTC+0100)] Getting domain auth token for each domain
[lundi 19 mars 2018, 14:58:10 (UTC+0100)] Getting webroot for domain='votredomaine.tld'
[lundi 19 mars 2018, 14:58:10 (UTC+0100)] Getting webroot for domain='*.votredomaine.tld'
[lundi 19 mars 2018, 14:58:10 (UTC+0100)] Found domain api file: /root/.acme.sh/dnsapi/dns_cf.sh
[lundi 19 mars 2018, 14:58:12 (UTC+0100)] Adding record
[lundi 19 mars 2018, 14:58:12 (UTC+0100)] Added, OK
[lundi 19 mars 2018, 14:58:12 (UTC+0100)] Sleep 120 seconds for the txt records to take effect
[lundi 19 mars 2018, 15:00:14 (UTC+0100)] votredomaine.tld is already verified, skip dns-01.
[lundi 19 mars 2018, 15:00:14 (UTC+0100)] Verifying:*.votredomaine.tld
[lundi 19 mars 2018, 15:00:17 (UTC+0100)] Pending
[lundi 19 mars 2018, 15:00:19 (UTC+0100)] Success
[lundi 19 mars 2018, 15:00:19 (UTC+0100)] Removing DNS records.
[lundi 19 mars 2018, 15:00:20 (UTC+0100)] Verify finished, start to sign.
[lundi 19 mars 2018, 15:00:22 (UTC+0100)] Cert success.
[lundi 19 mars 2018, 15:00:22 (UTC+0100)] Your cert is in /root/.acme.sh/votredomaine.tld_ecc/votredomaine.tld.cer
[lundi 19 mars 2018, 15:00:22 (UTC+0100)] Your cert key is in /root/.acme.sh/votredomaine.tld_ecc/votredomaine.tld.key
[lundi 19 mars 2018, 15:00:22 (UTC+0100)] The intermediate CA cert is in /root/.acme.sh/votredomaine.tld_ecc/ca.cer
[lundi 19 mars 2018, 15:00:22 (UTC+0100)] And the full chain certs is there: /root/.acme.sh/votredomaine.tld_ecc/fullchain.cer
Installer votre certificat SSL Wildcard avec Nginx
Comme expliqué précedemment dans notre premier article sur Acme.sh, il ne faut pas utiliser directement le certificat fullchain.cer ou clé privée stockée dans ~./.acme.sh. Il faut utiliser la commande acme.sh –install-cert pour définir où nous souhaitons stocker notre certificat SSL pour l’utiliser ensuite avec Apache ou Nginx.
Pour stocker notre certificat SSL nous avons choisi de créer un sous dossier acme.sh/votredomaine.tld dans /etc/nginx :
mkdir -p /etc/nginx/acme.sh/votredomaine.tld
On installe ensuite le certificat :
acme.sh --install-cert -d votredomaine.tld --ecc \
--cert-file /etc/nginx/acme.sh/votredomaine.tld/cert.pem \
--key-file /etc/nginx/acme.sh/votredomaine.tld/key.pem \
--fullchain-file /etc/nginx/acme.sh/votredomaine.tld/fullchain.pem \
--reloadcmd "systemctl reload nginx.service"
L’option--ecc
est nécessaire uniquement pour les certificat ECDSA.
La dernière étape est d’ajouter le certificat dans notre vhost Nginx, ou dans le cas d’EasyEngine dans /var/www/votredomaine.tld/conf/nginx/ssl.conf
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/nginx/acme.sh/votredomaine.tld/fullchain.pem;
ssl_certificate_key /etc/nginx/acme.sh/votredomaine.tld/key.pem;
ssl_trusted_certificate /etc/nginx/acme.sh/votredomaine.tld/cert.pem;