Jak ustalić datę ważności certyfikatu SSL na podstawie certyfikatu zakodowanego w PEM?

326

Jeśli mam rzeczywisty plik i powłokę Bash w systemie Mac lub Linux, jak mogę zapytać o plik cert, kiedy wygaśnie? Nie jest to strona internetowa, ale sam plik certyfikatu, zakładając, że mam pliki csr, key, pem i chain.

GL2014
źródło

Odpowiedzi:

629

Z openssl:

openssl x509 -enddate -noout -in file.pem

Dane wyjściowe mają postać:

notAfter=Nov  3 22:23:50 2014 GMT

Zobacz także odpowiedź MikeW, aby dowiedzieć się, jak łatwo sprawdzić, czy certyfikat wygasł, czy też nie, lub czy upłynie określony czas, bez konieczności analizowania powyższej daty.

ten inny facet
źródło
19
Masz również opcje -startdatei -enddatewbudowane w x509narzędzie. Uratują ci grep.
jww
2
działa to również, jeśli plik nie jest w formacie pem. działa dobrze dla server.crt
spójrz
163

Jeśli chcesz tylko wiedzieć, czy certyfikat wygasł (lub zrobi to w ciągu najbliższych N sekund), -checkend <seconds>opcja openssl x509:

if openssl x509 -checkend 86400 -noout -in file.pem
then
  echo "Certificate is good for another day!"
else
  echo "Certificate has expired or will do so within 24 hours!"
  echo "(or is invalid/not found)"
fi

Oszczędza to konieczności samodzielnego porównywania daty i godziny.

opensslzwróci kod zakończenia 0(zero), jeśli certyfikat nie wygasł i nie zrobi tego przez następne 86400 sekund, w powyższym przykładzie. Jeśli certyfikat wygasł lub już to zrobił - lub inny błąd, taki jak niepoprawny / nieistniejący plik - kod powrotu to 1.

(Oczywiście zakłada się, że czas / data są ustawione poprawnie)

MikeW
źródło
8
Aby ustalić, czy certyfikat wygasł, użyj czasu trwania zero sekund. Pomiń -nooutopcję wyświetlania pomocnego komunikatu za pomocą jednego polecenia bez dodatkowej logiki. Np. openssl x509 -checkend 0 -in file.pemDa wynik „Certyfikat wygaśnie” lub „Certyfikat nie wygaśnie” wskazując, czy certyfikat wygaśnie za zero sekund.
LS
1
Dzięki! Właśnie tego potrzebowałem! Dzięki kodom wyjścia, program będzie znacznie mniejszy / czystszy.
Lon Kaut,
24

Oto mój wiersz poleceń bash, aby wyświetlić listę wielu certyfikatów w kolejności ich wygaśnięcia, ostatnio wygasającą jako pierwszą.

for pem in /etc/ssl/certs/*.pem; do 
   printf '%s: %s\n' \
      "$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \
      "$pem"
done | sort

Przykładowe dane wyjściowe:

2015-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem
2016-03-22: /etc/ssl/certs/CA_Disig.pem
2016-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem
Nicholas Sushkin
źródło
Bardzo dobrze! Tego właśnie szukałem. Teraz mam przegląd certyfikatów, które muszę wkrótce odnowić. Zapisałem go jako checkcerts.sh w moim katalogu domowym, dzięki czemu mogę go regularnie sprawdzać. Następną rzeczą byłoby zlecenie CRON sprawdzania co miesiąc i wysyłania e-mailem certyfikatów wymagających odnowienia.
Pete,
3
Bardzo przydatne dzięki. Używam tego cronjoba0 7 * * 1 /path/to/cert.sh | mail -s "certbot" [email protected]
Matthieu
10

Oto funkcja bash, która sprawdza wszystkie twoje serwery, przy założeniu, że używasz round-robin DNS. Pamiętaj, że wymaga to daty GNU i nie będzie działać w systemie Mac OS

function check_certs () {
  if [ -z "$1" ]
  then
    echo "domain name missing"
    exit 1
  fi
  name="$1"
  shift

  now_epoch=$( date +%s )

  dig +noall +answer $name | while read _ _ _ _ ip;
  do
    echo -n "$ip:"
    expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 )
    echo -n " $expiry_date";
    expiry_epoch=$( date -d "$expiry_date" +%s )
    expiry_days="$(( ($expiry_epoch - $now_epoch) / (3600 * 24) ))"
    echo "    $expiry_days days"
  done
}

Przykład wyjściowy:

$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.65.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.129.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.193.69: Aug 14 12:00:00 2019 GMT    603 days
Andrzej
źródło
co zaskakujące, OSX 10.13.4 uruchamia twoją powłokę OK (nie oceniaj mnie, jestem dzisiaj tylko na osxie, aby wypchnąć aplikację do sklepu z aplikacjami ... wkrótce uruchamiam z powrotem do Linuksa ;-)
Scott Stensland
1
@ScottStensland Oceniamy :-P. Często używam Maca, ale Linux jest o wiele lepszy.
Mike Q,
Dziękuję bardzo za ten fragment kodu! Cóż za irytujące zadanie :) Chciałbym, żeby istniała uniksowa flaga znacznika czasu dla openssl.
user1279741,
1
Dla tych z was, którzy korzystają z alpejskiego kontenera z linuksem, wasza expiry_datewartość będzie musiała usunąć nazwę strefy czasowej z jej końca. Dodaj dodatkowy cutkoniec rury, aby to zrobić:| cut -d ' ' -f 1-4
Droogany
5

Sprawdzanie jednej linii wartości true / false, jeśli certyfikat domeny wygasnie później (np. 15 dni):

if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
then
  echo 'good'
else
  echo 'bad'
fi
Alexey
źródło
2

Dla MAC OSX (El Capitan) Ta modyfikacja przykładu Mikołaja działała dla mnie.

for pem in /path/to/certs/*.pem; do
    printf '%s: %s\n' \
        "$(date -jf "%b %e %H:%M:%S %Y %Z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%Y-%m-%d")" \
    "$pem";
done | sort

Przykładowe dane wyjściowe:

2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem

macOS nie lubił flag --date=lub --iso-8601w moim systemie.

Donald.M
źródło
Jak byś to zrobił, gdybyś nie utworzył plików .pem, a tylko .cercertyfikaty, które właśnie utworzyłeś i pobrałeś ze strony Apple Dev?
Alex Zavatone
1

Taka sama jak zaakceptowana odpowiedź, ale pamiętaj, że działa nawet z .crtplikiem, a nie tylko z .pemplikiem, na wypadek, gdybyś nie był w stanie znaleźć .pemlokalizacji pliku.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Wynik:

notAfter=Mar 29 06:15:00 2020 GMT
Srihari Karanth
źródło
0

Jeśli (z jakiegoś powodu) chcesz korzystać z aplikacji GUI w systemie Linux, użyj gcr-viewer(w większości dystrybucji jest instalowana przez pakiet gcr(inaczej w pakiecie gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Attila123
źródło