web-dev-qa-db-fra.com

Vérifier automatiquement que le certificat HTTPS a été renouvelé avec succès

J'ai un certificat permet de chiffrer HTTPS installé pour un site qui se renouvelle automatiquement.

Mon souci est que le renouvellement automatique puisse échouer et que les visiteurs puissent être accueillis avec un avertissement de certificat expiré.

Quel est le meilleur moyen de vérifier automatiquement que le certificat a été renouvelé? Je pensais à une sorte de script cron côté serveur à partir d'un serveur de test, mais cela semble un peu exagéré pour un problème que la plupart des sites HTTPS ont probablement rencontré, alors je me suis demandé s'il y avait une approche plus simple.

2
sam

J'utilise ssl-cert-check que j'installe via Apt sous Ubuntu:

Sudo apt install ssl-cert-check

Je le lance ensuite dans un travail quotidien tel que:

ssl-cert-check -f /etc/ssl-check-sites.txt  | /opt/bin/ssl-check-alert.pl

Où le fichier texte répertorie mes domaines comme:

example.com 443
example.net 443

Si vous exécutez ssl-cert-check, le résultat obtenu sera toujours le suivant:

Host                                            Status       Expires      Days
----------------------------------------------- ------------ ------------ ----
example.com:443                                 Valid        Oct 3 2018   35                                 
example.net:443                                 Valid        Oct 3 2018   35       

Le fichier Perl filtre la sortie de sorte que cron ne m'envoie un courrier électronique que si un certificat expire dans moins de 25 jours:

#!/usr/bin/Perl

use strict;

my $full = "";
my $error = 0;

foreach my $line (<STDIN>) {
    $full.=$line;
    chomp $line;

    if ($line =~ /^[ \t]*$/){
    } elsif ($line =~ /^Host/){
    } elsif ($line =~ /^-------/){
    } elsif ($line =~ /^\s*([a-z\.]+).*\s([\-0-9]+)\s*$/){
        my ($Host, $days) = ($1, $2);
        $days = 0 + $days;
        if ($days < 25){
            print "$Host SSL is expiring in $days days and should be renewed\n";
            $error = 1;
        }
    } else {
        print "Can't parse: $line\n";
        $error = 1;
    }
}

if ($error){
    print "\n\n\n$full";
    exit 1;
}

J'ai choisi 25 jours car les certificats LetsEncrypt sont généralement renouvelés à 30 jours. Cela leur donne quelques tentatives de renouvellement avant que je ne commence à recevoir des alertes. 25 jours sont encore suffisants pour résoudre les problèmes manuellement.

2
Stephen Ostermiller