new-certs-method #13
160
docs/Savaneprod/2025-03-31-certificats-wildcard-pour-synology.md
Normal file
160
docs/Savaneprod/2025-03-31-certificats-wildcard-pour-synology.md
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
---
|
||||||
|
title: "Générer et mettre à jour automatiquement un certificat \"wildcard\" auprès de ZeroSSL et le déployer dans Synology DSM."
|
||||||
|
summary: "ZeroSSL to Synology DSM wildcard certificate"
|
||||||
|
author:
|
||||||
|
- JF
|
||||||
|
date: 2025-03-31
|
||||||
|
---
|
||||||
|
# Générer et mettre à jour automatiquement un certificat "wildcard" auprès de ZeroSSL et le déployer dans Synology DSM.
|
||||||
|
|
||||||
|
Jusqu'à présent, les certificats des domaines dont je suis le propriétaire étaient mis à jour selon ce qui est explicité à cette page : [Générer et mettre à jour automatiquement un certificat "wildcard" let's encrypt.](2019-12-16-wildcard-lets-encrypt-certificate.md)
|
||||||
|
|
||||||
|
Nous sommes en mars 2025, Trump et sa bande sont à la tête d'un Pays munis du [Patriot Act](https://fr.wikipedia.org/wiki/USA_PATRIOT_Act). Il est grand temps de rapatrier la gestion des certificats de notre côté de l'Atlantique. Le seul service gratuit permettant d'utiliser [acme.sh](https://github.com/acmesh-official/acme.sh) que j'ai pu trouvé, c'est [ZeroSSL](https://zerossl.com/). Et ça tombe bien, c'est devenu le service par défaut utilisé par [acme.sh](https://github.com/acmesh-official/acme.sh/wiki/Change-default-CA-to-ZeroSSL).
|
||||||
|
|
||||||
|
De base je n'aimais pas le principe d'installer acme.sh, d'autant plus que ça ne fonctionnait pas de manière standard avec Synology DSM. C'était l'occasion d'écrire un beau script qui utilise le [conteneur docker](https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker) pour la génération et le renouvellement des certificats.
|
||||||
|
Pour importer automatiquement les certificats dans Synology DSM j'utilise le script acme.sh en "standalone" localement. Sans quoi il faudrait passer des identifiants root dans le conteneur Docker, autant dire que ça ne serait pas terrible.
|
||||||
|
|
||||||
|
## Utilisation du script
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /la/ou/qutu/veux/que/ton/certificat/il/soit
|
||||||
|
git clone https://gitea.savaneprod.fr/jf/Certificats.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Côté infomaniak
|
||||||
|
### Pour le challenge DNS (vérification que l'on possède bien le nom de domaine)
|
||||||
|
|
||||||
|
* Utilisation de l'API infomaniak : [https://github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_infomaniak](https://github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_infomaniak)
|
||||||
|
* Création d'un token d'API pour la gestion des entrées DNS :
|
||||||
|
Depuis la page d'accueil. Aller dans "Utilisateur et profil", "Mon profil", "Développeur" et "Tokens API".
|
||||||
|
|
||||||
|

|
||||||
|
* À partir de ça tu crées un fichier `INFOMANIAK_API_TOKEN.secret` qui contient :
|
||||||
|
```bash
|
||||||
|
INFOMANIAK_API_TOKEN="mon_t0k3n_9uil_e2t_grand_et_b1en_utile"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Côté ZeroSSL
|
||||||
|
### Afin d'obtenir des clefs d'API
|
||||||
|
|
||||||
|
La contrepartie de passer de Let's encrypt à ZeroSSL, est qu'il est nécessaire d'avoir un compte. Depuis ce compte on va pouvoir générer des clefs qui nous permettront d'utiliser une API spécialement conçue pour acme.sh .
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
À partir de ces clefs tu crées un fichier `ZEROSSL.secret` qui contient :
|
||||||
|
```bash
|
||||||
|
EAB_KID='lapetiteclef'
|
||||||
|
EAB_HMAC_KEY='laGrosse_ClefDeLamort\gna'
|
||||||
|
```
|
||||||
|
|
||||||
|
## *Et pis c'est tout !*
|
||||||
|
|
||||||
|
T'as plus qu'à exécuter `issue-or-renew-certs-for-dsm.sh`.
|
||||||
|
```bash
|
||||||
|
SCRIPT_PATH="$(dirname $(readlink -f $BASH_SOURCE))"
|
||||||
|
DOMAIN_FILES_PATH="$SCRIPT_PATH/domains"
|
||||||
|
ACMESH_CONTAINER_DATA_PATH="$SCRIPT_PATH/data"
|
||||||
|
ACMESH_LOCAL_PATH="$SCRIPT_PATH/acme.sh"
|
||||||
|
|
||||||
|
JOUR="$(date +%Y-%m-%d_%H%M)"
|
||||||
|
LOGFILENAME="logs/$JOUR.log"
|
||||||
|
|
||||||
|
if [ "$1" = "--help" ]
|
||||||
|
then
|
||||||
|
docker run --rm -it neilpang/acme.sh --help
|
||||||
|
docker rmi -f neilpang/acme.sh
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ls $DOMAIN_FILES_PATH/*.domain > /dev/null 2>&1
|
||||||
|
if [ $? -eq 2 ]
|
||||||
|
then
|
||||||
|
echo "No domain file exists.
|
||||||
|
At least one .domain file must exists at $DOMAIN_FILES_PATH.
|
||||||
|
The file defines variables \$DOMAIN and \$SUBJECT_ALTERNATIVE_NAME."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $SCRIPT_PATH/logs ]
|
||||||
|
then mkdir -p $SCRIPT_PATH/logs
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f $SCRIPT_PATH/INFOMANIAK_API_TOKEN.secret ]
|
||||||
|
then source $SCRIPT_PATH/INFOMANIAK_API_TOKEN.secret
|
||||||
|
else echo "
|
||||||
|
Le token d'API d'Infomaniak est manquant.
|
||||||
|
INFOMANIAK_API_TOKEN.secret doit définir la variable INFOMANIAK_API_TOKEN=\"xxxxx\"
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f $SCRIPT_PATH/ZEROSSL.secret ]
|
||||||
|
then source $SCRIPT_PATH/ZEROSSL.secret
|
||||||
|
else echo "
|
||||||
|
Les clefs d'API de zeroSSL sont manquantes.
|
||||||
|
Le fichier ZEROSSL.secret doit définir les variables EAB_KID='xxx' et EAB_HMAC_KEY='xxx'
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for d in $(ls $DOMAIN_FILES_PATH/*.domain)
|
||||||
|
do
|
||||||
|
source $d
|
||||||
|
if [ -d $ACMESH_CONTAINER_DATA_PATH/$DOMAIN_ecc ]
|
||||||
|
then ISSUE_OR_RENEW="--renew"; ACTION="Renouvellement"
|
||||||
|
else
|
||||||
|
ISSUE_OR_RENEW="--issue"; ACTION="Création"
|
||||||
|
mkdir $ACMESH_CONTAINER_DATA_PATH
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "####### $ACTION du certificat $DOMAIN #######" | tee -a $SCRIPT_PATH/$LOGFILENAME
|
||||||
|
|
||||||
|
docker run --rm -it \
|
||||||
|
-v "$ACMESH_CONTAINER_DATA_PATH":/acme.sh \
|
||||||
|
-v "$SCRIPT_PATH/logs:/logs" \
|
||||||
|
-e $INFOMANIAK_API_TOKEN \
|
||||||
|
neilpang/acme.sh $ISSUE_OR_RENEW -d $DOMAIN -d $SUBJECT_ALTERNATIVE_NAME --server zerossl --eab-kid $EAB_KID --eab-hmac-key $EAB_HMAC_KEY --dns dns_infomaniak --log "/$LOGFILENAME"
|
||||||
|
|
||||||
|
echo "####### Déploiement du certificat $DOMAIN sur DSM #######" | tee -a $SCRIPT_PATH/$LOGFILENAME
|
||||||
|
|
||||||
|
if [ ! -d $ACMESH_LOCAL_PATH ]
|
||||||
|
then git clone https://github.com/acmesh-official/acme.sh.git $ACMESH_LOCAL_PATH
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SYNO_CERTIFICATE="$DOMAIN cert"
|
||||||
|
# Creates the cert in DSM if it does not exist in Security/Certificate management.
|
||||||
|
export SYNO_Create=1
|
||||||
|
# When run locally, use an automatically created temp admin. Deletes it after use.
|
||||||
|
# https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-certificate-to-synology-dsm
|
||||||
|
export SYNO_USE_TEMP_ADMIN=1
|
||||||
|
|
||||||
|
bash $ACMESH_LOCAL_PATH/acme.sh --home $ACMESH_CONTAINER_DATA_PATH -d $DOMAIN -d $SUBJECT_ALTERNATIVE_NAME --deploy --deploy-hook synology_dsm --log $SCRIPT_PATH/$LOGFILENAME
|
||||||
|
|
||||||
|
unset DOMAIN SUBJECT_ALTERNATIVE_NAME
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "
|
||||||
|
####### Suppression de $ACMESH_LOCAL_PATH... ########
|
||||||
|
"
|
||||||
|
rm -rf $ACMESH_LOCAL_PATH
|
||||||
|
echo "
|
||||||
|
####### Suppresion de l'image docker... #######
|
||||||
|
"
|
||||||
|
docker rmi -f neilpang/acme.sh
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
```
|
||||||
|
|
||||||
|
## La conf dans DSM dans le planificateur de tâches
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
J'ai finalement décidé de renouveler tous les mois parce que le Synology propose tous les 3 mois mais la durée de vie du certificat est légèrement inférieure. Et je n'ai pas cherché à configurer le renouvellement tous les deux mois.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Exécution du script. Il faut bien entendu que le script ait la permission d'éxécution configurée.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
BIN
docs/Savaneprod/zerossl_1.png
Normal file
BIN
docs/Savaneprod/zerossl_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
BIN
docs/Savaneprod/zerossl_2.png
Normal file
BIN
docs/Savaneprod/zerossl_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
@@ -5,7 +5,7 @@ nav:
|
|||||||
- Savaneprod:
|
- Savaneprod:
|
||||||
- "Savaneprod/2024-02-29-customized-dyndns-for-synology.md"
|
- "Savaneprod/2024-02-29-customized-dyndns-for-synology.md"
|
||||||
- "Savaneprod/2019-09-01-access-synology-with-ssh-asymetrical-key.md"
|
- "Savaneprod/2019-09-01-access-synology-with-ssh-asymetrical-key.md"
|
||||||
- "Savaneprod/2019-12-16-wildcard-lets-encrypt-certificate.md"
|
- "Savaneprod/2025-03-31-certificats-wildcard-pour-synology.md"
|
||||||
- "Savaneprod/2020-12-04-borg-backup.md"
|
- "Savaneprod/2020-12-04-borg-backup.md"
|
||||||
- "Savaneprod/2021-02-06-restore-time-machine-backup.md"
|
- "Savaneprod/2021-02-06-restore-time-machine-backup.md"
|
||||||
- "Savaneprod/2023-11-14-savanewiki-plubication.md"
|
- "Savaneprod/2023-11-14-savanewiki-plubication.md"
|
||||||
|
|||||||
Reference in New Issue
Block a user