Let's Encrypt

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche
m (Jordan a déplacé la page Let's Encrypt vers Technique/Let's Encrypt sans laisser de redirection)

Version du 6 juin 2019 à 13:10

Installation sur un ESXi

Au regard de la complexité d'installation de cerbot et de ses dépendances sur un ESXi, il a été décidé de s'appuyer sur le package Acme du routeur/pare-feu pfSense pour générer le certificat et sur un script shell pour rapatrier ledit certificat sur l'ESXi.

Créer les clés SSH

ssh-keygen n'étant pas présent sur le serveur ESXi, nous allons lancer la commande suivante sur un autre serveur Linux :

ssh-keygen -t rsa

Cela génère une clé privée .ssh/id_rsa et une clé publique .ssh/id_rsa.pub.

Editer la clé publique .ssh/id_rsa.pub, modifier le nom d'utilisateur et le nom d'hôte afin que cela corresponde avec l'utilisateur et le nom de l'ESXi.

Sur le serveur Linux, copier les clés SSH précédemment générées et les déposer sur le serveur ESXi dans un dossier .ssh créé à la racine du dossier home de l'utilisateur de l'ESXi.

Sur le serveur ESXi, sécuriser l'accès au dossier .ssh :

chmod 700 .ssh
chmod 600 .ssh/*

Au niveau du routeur/pare-feu pfSense, mettre en place les règles nécessaires afin de n'ajouter l'autorisation de connexion SSH qu'au serveur ESXi seulement.

Sur le routeur/pare-feu pfSense, se connecter en SSH en tant que root et créer un dossier .ssh à la racine du dossier home :

mkdir ~/.ssh

Editer un fichier ~/.ssh/authorized_keys et ajouter le contenu de la clé publique id_rsa.pub précédemment créée.

Sécuriser l'accès au dossier .ssh du routeur/pare-feu pfSense :

chmod 700 .ssh
chmod 600 .ssh/*

Depuis le serveur ESXi, faire un test de connexion SSH vers le routeur/pare-feu pfSense, la connexion devrait être fonctionnelle et ne pas demander de mot de passe.

Sauvegarde des certificats par défaut

Sur le serveur ESXi, sauvegarder la clé privée et le certificat existants :

mv /etc/vmware/ssl/rui.crt /etc/vmware/ssl/rui.crt_sav20180618
mv /etc/vmware/ssl/rui.key /etc/vmware/ssl/rui.key_sav20180618

Automatisation de la récupération du certificat SSL

Grâce à l'authentification par clé SSH précédemment réalisée, le script suivant permet la récupération automatique du certificat SSL d'une part, et la mise à jour de ce dernier sur le serveur ESXi si nécessaire d'autre part.

#!/bin/sh

# Définition des variables
LOG_DIR=/var/log/ssl_cert
SCRIPT_NAME=$(echo $0|awk -F"/" '{print $NF}'|awk -F"." '{print $1}')
LOG_FILE=$LOG_DIR/$SCRIPT_NAME$(date +"_%Y-%d-%m_%H-%M").log
TEMP_DIR=/tmp
REMOTE_HOST=xxxxxxxx
REMOTE_USER=xxxxxxx
REMOTE_DIR=xxxxxxxxxxxxxxxxxxxxxxxxxx
REMOTE_CERT=xxxxxxxxxxxxxxxxxxxx.cer
LOCAL_DIR=/etc/vmware/ssl
LOCAL_CERT=rui.crt

# Récupération du certificat
scp $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_CERT $TEMP_DIR/ >> $LOG_FILE 2>&1

ERROR_CODE_SCP=$?

if [ $ERROR_CODE_SCP -eq 0 ] # Le SCP s'est bien déroulé
then
	echo $(date "+%F %T ")"Le code erreur scp est "$ERROR_CODE_SCP". Suite du script." >> $LOG_FILE 2>&1
	# Comparaison des certificats
	diff $TEMP_DIR/$REMOTE_CERT $LOCAL_DIR/$LOCAL_CERT >> $LOG_FILE 2>&1
	
	ERROR_CODE_DIFF=$?

	if [ $ERROR_CODE_DIFF -eq 0 ] # Le diff ne remonte aucune différence
	then
		echo $(date "+%F %T ")"Le code erreur diff est "$ERROR_CODE_DIFF". Le diff ne remonte aucune différence. Arrêt normal du script." >> $LOG_FILE 2>&1
		exit 0
	elif [ $ERROR_CODE_DIFF -eq 1 ] # Le diff remonte une différence
	then
		echo $(date "+%F %T ")"Le code erreur diff est "$ERROR_CODE_DIFF". Suite du script." >> $LOG_FILE 2>&1
		# Sauvegarde de l'ancien certificat
		mv $LOCAL_DIR/$LOCAL_CERT $LOCAL_DIR/$LOCAL_CERT$(date +"_sav%Y%d%m") >> $LOG_FILE 2>&1

		ERROR_CODE_MV1=$?
		
		if [ $ERROR_CODE_MV1 -eq 0 ] # Le mv1 s'est bien déroulé
		then
			echo $(date "+%F %T ")"Le code erreur mv1 est "$ERROR_CODE_DIFF". Suite du script." >> $LOG_FILE 2>&1
			# Mise en place du nouveau certificat
			mv $TEMP_DIR/$REMOTE_CERT $LOCAL_DIR/$LOCAL_CERT >> $LOG_FILE 2>&1
			
			ERROR_CODE_MV2=$?
			
			if [ $ERROR_CODE_MV2 -eq 0 ] # Le mv2 s'est bien déroulé
			then
				echo $(date "+%F %T ")"Le code erreur mv2 est "$ERROR_CODE_DIFF". Suite du script." >> $LOG_FILE 2>&1
				# Relance des services de l'ESXi pour prise en compte du nouveau certificat
				/bin/services.sh  >> $LOG_FILE 2>&1
				exit 0
			else # Le mv2 rencontre une erreur
				echo $(date "+%F %T ")"Le code erreur mv2 est "$ERROR_CODE_DIFF". Arrêt prématuré du script." >> $LOG_FILE 2>&1
				exit 1
			fi
		else # Le mv1 rencontre une erreur
			echo $(date "+%F %T ")"Le code erreur mv1 est "$ERROR_CODE_DIFF". Arrêt prématuré du script." >> $LOG_FILE 2>&1
			exit 1
		fi
	else # Le diff rencontre une erreur
		echo $(date "+%F %T ")"Le code erreur diff est "$ERROR_CODE_DIFF". Arrêt prématuré du script." >> $LOG_FILE 2>&1
		exit 1
	fi

else # Le SCP a rencontré une erreur
	echo $(date "+%F %T ")"Le code erreur scp est "$ERROR_CODE_SCP". Arrêt prématuré du script." >> $LOG_FILE 2>&1
	exit 1
fi