Bonjour à tous,
Ayant été confronté récemment (et pendant mes vacances, loin de chez moi) à un pb de renouvellement du certificat https de mon Jeedom, je me suis lancé dans la réalisation d’un scenario de vérification, de renouvellement et de notification de pbs de renouvellement du certificat de mon jeedom.
je poste ici la procédure si ceci intéresse du monde.
Prerequis : une configuration HTTPS foncitonnelle avec un certificat let’s encrypt et cerbot installé
J’utilisse pour notifier le plugin-jeedomconnect mais vous pouvez bien sur personnaliser avec un autre plugin de notification
Rappel 1 concernant les certificat Let’s Encrypt : ils sont valables 90 jours et peuvent etre renouveler au bout de 60 jours, soit lorsqu’il reste 30jours
Rappel 2 : le renouvellement necessite un accès http exterieur au serveur (port 80) pour fonctionner
(en bonus, comment paramétrer son Jeedom pou rne plus avoir besoin d’ouvri le port 80 avec OVH - challenge DNS : Tuto : Gestion du renouvellement d'un certificat Let's Encrypt via scenario Jeedom - #37 par ngrataloup)
Et le scenario à telecharger et installer avec le modele ci-après :
Renouvellement_certificat.json.txt (8,3 Ko)
Fonctionnement du scenario
Une première partie pour les « variables ». NORMALEMENT, vous n’avez que ca à modifier (pour les utilisateurs du plugin plugin-jeedomconnect)
- domaine : le domaine à gerer (en fait, le nom du certificat)
- expirationAlerte : le nb de jours restants pour le certificat avant d’etre alerté d’un pb de renouvellement
- renewAuto : l’activation (1) ou non (0) du renouvellement auto
- renewDate : le nb de jours restants pour réaliser un renouvellement
- cmdNotifOK et cmdNotifErreur : les commandes de notification
Pour le fonctionnement du scenario :
Il commence par vérifier pour le certificat en question la date d’expiration et le nb de jours restants
il renvoie une erreur si le nb de jours restant est inferieur à $expirationAlerte ou n’est pas numérique (erreur avec la commande ssh !)
si le nb de jours restants est inferieur à renewDate et que le renouvellement auto est activé, il renouvelle le certificat et envoie une notif en fonction du résultat.
Ex d’une notif JC de renouvellement en erreur :
le bloc code brut pour ceux qui preferent plutot que le template de scenario :
$tags=$scenario->getTags(); // récupération des tag du scénario
$domaine=$tags['#domaine#'];
$alerte=$tags['#expirationAlerte#'];
$renewAuto =$tags['#renewAuto#'];
$renewDate =$tags['#renewDate#'];
$cmdNotifOK = cmd::byString('#'.$tags['#cmdNotifOK#'].'#');
$cmdNotifErreur = cmd::byString('#'.$tags['#cmdNotifErreur#'].'#');
// Execution de commandes SSH pour determination de la date de renouvellement
$expirationDate = date("d/m/Y",strtotime(str_replace(CHR(10),"",shell_exec ("sudo certbot certificates --cert-name ".$domaine." | grep 'Expiry Date'| awk '{print $3}'"))));
$expirationDay = str_replace(CHR(10),"",shell_exec ("sudo certbot certificates --cert-name ".$domaine." | grep 'Expiry Date'| awk '{print $6}'"));
if ( $expirationDay <= $alerte || is_numeric($expirationDay) == 0 ) {
$msgErreur = 'Erreur de renouvellement du certificat pour le domaine '.$domaine.', Pas de date d\'expiration ou date d\'expiration inferieure à '.$alerte.'<br>verifier la commande ci-dessous en ssh<br>sudo certbot certificates --cert-name '.$domaine ;
$scenario->setlog($msgErreur);
$cmdNotifErreur->execCmd($options = array('title' => 'title=Erreur renouvellement du certificat', 'message' => $msgErreur , $cache = 0));
}
else {
if ( $renewAuto == 1 ) {
if ( $expirationDay <= $renewDate ) {
// Renouvellement auto si necessaire
$statutRenew = shell_exec ("sudo certbot renew --cert-name ".$domaine." | grep -c 'Congratulations, all renewals succeeded'");
if ( $statutRenew == 1 ) {
$expirationDate = date("d/m/Y",strtotime(str_replace(CHR(10),"",shell_exec ("sudo certbot certificates --cert-name ".$domaine." | grep 'Expiry Date'| awk '{print $3}'"))));
$expirationDay = str_replace(CHR(10),"",shell_exec ("sudo certbot certificates --cert-name ".$domaine." | grep 'Expiry Date'| awk '{print $6}'"));
$msgOK='Renouvellement du certificat pour le domaine '.$domaine.', nouvelle expiration dans '.$expirationDay.' jours ('.$expirationDate.')';
$scenario->setlog($msgOK);
$cmdNotifOK->execCmd($options = array('title' => 'title=Renouvellement du certificat', 'message' => $msgOK , $cache = 0));
}
else {
$msgErreur = 'Erreur de renouvellement du certificat pour le domaine '.$domaine.', expiration dans '.$expirationDay.' jours ('.$expirationDate.')<br>Essayer la commande ci-dessous en SSH<br>sudo certbot renew --cert-name '.$domaine;
$scenario->setlog($msgErreur);
$cmdNotifErreur->execCmd($options = array('title' => 'title=Erreur renouvellement du certificat', 'message' => $msgErreur , $cache = 0));
}
}
else $scenario->setlog('Aucun renouvellement de certificat à réaliser pour le domaine '.$domaine.', expiration dans '.$expirationDay.' jours ('.$expirationDate.')');
}
else {
$scenario->setlog('Renouvellement automatique desactivé pour le domaine '.$domaine.', Expiration dans '.$expirationDay.' jours ('.$expirationDate.')') ;
if ( $expirationDay <= $renewDate ) {
$msgRenew = 'Renouvellement nécessaire du certificat pour le domaine '.$domaine.', Expiration dans '.$expirationDay.' jours ('.$expirationDate.')' ;
$scenario->setlog($msgRenew) ;
$cmdNotifErreur->execCmd($options = array('title' => 'title=renouvellement nécessaire du certificat', 'message' => $msgRenew , $cache = 0));
}
}
}
Esperant que ca puisse aider quelques jeedomiens
Norbert