Aller au contenu

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


Messages recommandés

Posté(e) (modifié)

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
Posté(e)

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 ?!

Posté(e)

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.

Posté(e)

SincĂšrement, je sais plus. Je faisais d'autres choses en mĂȘme temps đŸ€Ł

Mais ça Ă©tĂ© assez rapide tout de mĂȘme.

 

Citation

Il serait bon que les gens viennent faire un retour...

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

Posté(e)
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.

Posté(e)

@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.

Posté(e)

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

Posté(e)

@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

Posté(e)

@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

Posté(e)

@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/... ?

Posté(e)

@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

Posté(e)
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 😄

Posté(e)

@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

Posté(e)

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 😉

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.