Aller au contenu

[TUTO] Certificat Let's Encrypt avec acme.sh & api Ovh en Docker (DSM6/7) (Update 07/09/22)


Einsteinium

Messages recommandés

Bonjour à tous,

Nous allons voir dans ce tutoriel comment mettre en place rapidement un certificat Let's Encrypt avec la méthode acme.sh en utilisant l'api Ovh en Docker, si vous êtes rapide, en 10 minutes c'est en place.

Pourquoi en docker ? Car je suis contre la pollution du DSM, des corruptions par update, mais aussi par simplicité et rapidité.

 

1) On commence par la création de clé d'api chez ovh :

https://api.ovh.com/createToken/?GET=/domain/zone/mydomain.com/*&POST=/domain/zone/mydomain.com/*&PUT=/domain/zone/mydomain.com/*&GET=/domain/zone/mydomain.com&DELETE=/domain/zone/mydomain.com/record/*

On remplit donc le formulaire, pour "Validity" (1) on choisit "Unlimited", pour "Rights" (2) on remplace dans les champs "mydomain.com" par le vôtre et dans "Restricted IPs" (3), on rajoute son IP afin qu'en cas de vol des clés, elles ne puissent être exploitées et votre domaine détourné. (NB : Si vous n'avez pas une IP fixe, on passe ce dernier point)

N4Su6pp.png

On garde les clés retournées en résultat sous la main pour la suite.

 

 

2) Passons maintenant au docker :

 

A) On commence par la création d'un dossier "Acme" dans le dossier docker.

 

B) La création du fichier de config :

On crée avec l'éditeur de texte du DSM (Codage UTF-8) le fichier "account.conf" à la racine de notre dossier "Acme" contenant :

LOG_FILE="/acme.sh/acme.sh.log"
LOG_LEVEL=1

AUTO_UPGRADE='1'

#NO_TIMESTAMP=1
    
USER_PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
SAVED_OVH_AK='XXXXXXX'
SAVED_OVH_AS='XXXXXXX'
SAVED_OVH_CK='XXXXXXX'

DEFAULT_ACME_SERVER='https://acme-v02.api.letsencrypt.org/directory'

On remplace dedans le contenu des 3 variables "SAVED_OVH_**" par nos clés obtenues précédemment par OVH.

 

C) La création du docker :

On va mettre un petit peu de code pour la création du docker et son actualisation journalière via le gestionnaire de tâche...

Panneau de configuration / Planificateur de tâches / Créer / Tâche planifiée / Script défini par l'utilisateur

Utilisateur : Root

On programme pour une exécution par jour la nuit (5h c'est bien)

Exécuter la commande :

docker pull neilpang/acme.sh:latest
docker stop Acme
docker rm Acme
docker image prune -f
docker volume ls -qf dangling=true | xargs -r docker volume rm
docker run -d --cpu-shares=10 --memory=134217728 --name=Acme -v /volume1/docker/Acme:/acme.sh:rw --restart unless-stopped neilpang/acme.sh:latest daemon

On exécute manuellement la tâche une première fois pour la création du docker.

 

C Bis) Le docker-compose.yml :

version: "2.1"
services:
  acme:
    cpu_shares: 10
    mem_limit: 128M
    container_name: Acme
    network_mode: bridge
    labels:
      - com.centurylinklabs.watchtower.enable=true
    volumes:
      - /volume1/docker/Acme:/acme.sh:rw
    restart: unless-stopped
    image: neilpang/acme.sh:latest
    command: daemon

 

D) Création du certificat :

Avec le planificateur de tâche en exécution unique (cf point 2C) ou en ssh (root) en remplaçant "mydomain.com" :

docker exec Acme sh -c "acme.sh --issue --keylength 4096 -d 'mydomain.com' -d '*.mydomain.com' --dns dns_ovh"

Il n'y a rien à détailler pour expliquer cette commande, le keylenght peut être, on double la valeur par défaut qui est aujourd'hui considérée comme faible à 2048.

/!\ Renouvellement automatique du certificat sans action de votre part

 

 

3) Installation des certificats :

 

A) Importation manuel :

Vos certificats seront disponibles directement dans filestation "docker/Acme/votredomaine" et ce qui nous intéresse dedans :

Certificat : mydomain.com.cer
Clé privée : mydomain.com.key
Certificat intermédiaire : ca.cer

On va maintenant faire leur import manuellement, dans "Panneau de configuration/Sécurité/Certificat".

En cas d'import manuel, vous pouvez activer la notification mail, mais cette action se réalise toujours 1 mois avant expiration : https://github.com/acmesh-official/acme.sh/wiki/notify

 

B) Déploiement automatique :

NB : Faire un premier déploiement manuel avant le déploiement automatique, afin de bien le mettre par défaut et supprimer celui de synology par défaut.

1) Création d'un compte que l'on rajoutera dans le groupe admin, on lui mettra aucun acces à tous les dossiers et refuser à toutes les applications, on active pas la double authentification qui sera inutile.

2) On ré édite notre fichier "account.conf" créé au point 2B, on y rajoute :

SAVED_SYNO_Scheme='http'
SAVED_SYNO_Hostname='172.17.0.1'
SAVED_SYNO_Port='5000'
SAVED_SYNO_Username='nom utilisateur'
SAVED_SYNO_Password='le password'
SAVED_SYNO_DID=''
SAVED_SYNO_Certificate='description du certificat mise dans le DSM'

3) Ensuite une fois les modifications faites, avec le planificateur de tâche en exécution unique (Cf point 2C) ou en ssh (root) :

docker exec Acme sh -c "acme.sh --deploy -d 'mydomain.com' --deploy-hook synology_dsm"

 

Guide officiel : https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide

Pour d'autres API que ovh : https://github.com/acmesh-official/acme.sh/wiki/dnsapi

😉

Modifié par Einsteinium
update tutoriel, ajout docker compose et modification suite évolution
Lien vers le commentaire
Partager sur d’autres sites

Hello,

Super tuto clair, rapide et concis, merci 😉

Je vais pouvoir virer mon automatisation de script et ainsi ne plus avoir à remettre Acme après chaque MAJ de DSM.

Vivement que le hook soit mis à jour afin d'automatiser l'injection dans DSM.

 

Petite question, comment vois-tu qu'il va renouveler automatiquement tous les X temps stp ?

Et est-ce qu'il faut virer l'ancien certificat ou il sera purement et simplement remplacé dans le dossier portant son nom ?!

Lien vers le commentaire
Partager sur d’autres sites

Le cron est directement inclus dans le docker, une fois par jour la nuit, on peux même savoir dans le log quand aura lieu de prochain, exemple : Skip, Next renewal time is: Tue Dec  8 20:21:14 UTC 2020

J'ai pas testé, n'y feuilleté cette partie de la notice, mais je dirais qu'il le remplace, voir si c'est comme cerbot, il numérote.

Lien vers le commentaire
Partager sur d’autres sites

Le 17/10/2020 à 10:35, unPixel a dit :

Toujours un soucis sur les communautés de la toile...

Effectivement et je vois le compteur qui monte, apparemment le tutoriel intéresse, mais personne n'est foutu de venir dire merci ou faire un retour.

Pour ceux que sa intéresse, les liens seront donnés par message privé, au cas par cas.

Lien vers le commentaire
Partager sur d’autres sites

@Einsteinium bonjour,

je dois faire partie de ceux qui ont téléchargé .... et n'ont pas encore fait de retour . Désolé, ça va venir. Tout simplement, ma migration dsm6 => dsm7 a été un peu plus douloureuse que prévue (faut d'ailleurs que je mette une synthèse à ce propos dans le fil dsm7). Je vais m'y remettre, aucun doute.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Einsteinium,

avant de me lancer, j'aurai une petite question : ayant déjà 3 certificats LE acme.sh valides, je me pose la question de savoir comment les intégrer dans ce process ? Le plus simple est peut-être de les effacer/supprimer, puis de les recréer en suivant ce Tuto depuis le début ?

Merci, Bruno78

Lien vers le commentaire
Partager sur d’autres sites

@Einsteinium, bonjour,

je viens de faire le premier domaine selon cette méthode .... c'est presque déconcertant de facilité ! Top. RDV dans 2 mois pour voir le renouvellement 🙂. Ca ma pris en gros 30min parce qu'en plus je prends note de ce que je fais ainsi que des screenshots. Sinon en 15 min c'est fait.

Par contre, je n'ai pas compris comment gérer plusieurs domaines : si je demande de nouvelles clés pour un domaine suivant, il faudra mettre à jour account.conf ? Mais du coup ce ne sera plus cohérent avec le premier ? me fais-je des nœuds au cerveau  ? Ou alors faut'il d'un coup créer un seul jeu de clé OVH pour tous les domaines concernés ?

Merci en tout cas pour ce tuto !

Bruno78

Lien vers le commentaire
Partager sur d’autres sites

@Einsteinium, @unPixel,

ok, c'est bien les 2 solutions auxquelles j'avais pensé. 

Je crois que compte tenu de leur faible "encombrement" et consommation de ressources, et pour garder l'indépendance entre les différents domaines, je vais opter pour la solution "1 domaine = 1 docker". L'inconvenient, c'est plusieurs jeux de clés OVH , mais bon une fois que c'est fait ....  Je fais ca et je vous dis .... .

Merci, Bruno78

Lien vers le commentaire
Partager sur d’autres sites

@Einsteinium C'est à dire qu'une fois le certificat généré, pour le renouvellement, plus besoin des api renseignées dans Acme/account.conf ? toutes les infos necessaires sont dans les fichiers de conf du domaine Acme/ndd.tld/... ?

Lien vers le commentaire
Partager sur d’autres sites

il y a 51 minutes, bruno78 a dit :

@Einsteinium

bon ben voilà, chacun de mes 3 certificats LE Wildcard acme.sh sur api dns_ovh dans un docker acme.sh séparé .... 🙂

Une balade !

Merci, Bruno78

c'était le but la balade ^^

J'éditerais le topic quand il y aura l'import automatique dans dsm 7, la balade sera totale 😄

Lien vers le commentaire
Partager sur d’autres sites

@Einsteinium bonjour,

j'ai tenter d'activer sur les conteneurs Acme la notification par mail, mais la réponse est la suivante :

/acme.sh # export MAIL_FROM="webmaster@ndd.tld"
/acme.sh # export MAIL_TO="bruno78@ndd.tld"
/acme.sh # acme.sh --set-notify --notify-level 2 --notify-hook mail
[Fri Oct 23 07:08:32 UTC 2020] Set notify level to: 2
[Fri Oct 23 07:08:32 UTC 2020] Set notify hook to: mail
[Fri Oct 23 07:08:32 UTC 2020] Sending via: mail
Usage: _exists cmd
[Fri Oct 23 07:08:32 UTC 2020] sendmail: can't connect to remote host (127.0.0.1): Connection refused
[Fri Oct 23 07:08:32 UTC 2020] Error send message by mail_send
[Fri Oct 23 07:08:32 UTC 2020] Set /root/.acme.sh/notify/mail.sh error.
[Fri Oct 23 07:08:32 UTC 2020] Can not set notify hook to: mail
/acme.sh #

Je suppose qu'il y a un minimum de configuration supplémentaire à faire ? ou faut'il utiliser un service comme mailgun.com ?

Merci

Bruno78

Lien vers le commentaire
Partager sur d’autres sites

Je n'ai pas regardé la notification, dans la mesure ou la date de renouvellement est déjà connue (via le conf du domaine ou en regardant les logs)

Le docker utilise busybox, donc en éditant /root/.acme.sh/notify/mail.sh, ligne 103 on rajoute à la fin -S ip:port du serveur sendmail (exemple : _MAIL_ARGS="-f '$MAIL_FROM' -S serveur:port" ) Voir avec les variables d'authentification si serveur externe, sendmail via busybox n'a pas de fichier de configuration, il faut donc passé en ligne de commande et donc la en éditant le fichier mail.sh directement qui l'envois.

ps : je te recommande de passé par sendgrid.com, gratuit 😉

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.