PEM kodlu bir sertifikadan SSL sertifikası son kullanma tarihi nasıl belirlenir?


326

Mac veya Linux'ta gerçek dosya ve bir Bash kabuğum varsa, cert dosyasını ne zaman sona ereceği için nasıl sorgulayabilirim? Bir web sitesi değil, aslında sertifika dosyasının kendisi, csr, anahtar, pem ve zincir dosyaları var varsayalım.

Yanıtlar:


630

İle openssl:

openssl x509 -enddate -noout -in file.pem

Çıktı şu şekildedir:

notAfter=Nov  3 22:23:50 2014 GMT

Ayrıca , yukarıdaki tarihi ayrıştırmak zorunda kalmadan sertifikanın süresinin dolup dolmadığını veya belirli bir zaman dilimi içinde olup olmayacağını kolayca kontrol etmek için MikeW'nin cevabına bakın .


19
Ayrıca yardımcı programda yerleşik -startdateve -enddateseçenekleri de vardır x509. Onlar seni kurtaracak grep.
jww

2
dosya pem biçiminde değilse bu da çalışır. server.crt cezasını işleri
look

163

Sadece sertifikasının süresi doldu (veya bir sonraki N saniye içinde bunu yapacaktır) olmadığını bilmek istiyorsanız, -checkend <seconds>seçenek için openssl x509size söyleyecektir:

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

Bu tarih / saat karşılaştırmaları yapmak zorunda kalmazsınız.

openssl0sertifikanın süresi dolmamışsa ve sonraki 86400 saniye boyunca bunu yapmayacaksa, yukarıdaki örnekte (sıfır) çıkış kodu döndürür . Sertifikanın süresi dolduysa veya zaten yapmışsa - veya geçersiz / var olmayan bir dosya gibi başka bir hata varsa - dönüş kodu 1.

(Tabii ki, saat / tarihin doğru ayarlandığını varsayar)


8
Bir sertifikanın süresinin dolup dolmadığını belirlemek için sıfır saniyelik bir süre kullanın. -nooutEkstra mantık olmadan tek bir komut kullanarak yararlı bir mesaj görme seçeneğini atlayın . Örneğin, openssl x509 -checkend 0 -in file.pem"Sertifikanın süresi doluyor" veya sertifikanın süresinin dolup dolmayacağını belirten "Sertifikanın süresi dolmayacak" çıktısı verilir.
LS

1
Teşekkürler! Tam da ihtiyacım olan şey bu! Çıkış kodları ile çok daha küçük / temiz bir program oluşturacaktır.
Lon Kaut

24

Burada, en son önce süresi dolan birden fazla sertifikayı sona erme sırasına göre listelemek için bash komut satırım var.

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

Örnek çıktı:

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

Çok hoş! Ben de bundan sonraydım. Şimdi yakında yenilemek zorunda olduğum sertifikalara bir genel bakış var. Düzenli olarak kontrol edebilmem için ana klasörümde checkcerts.sh olarak kaydetti. Bir sonraki şey, her ay kontrol etmek ve yenilenmesi gereken sertifikaları e-postayla göndermek için bir CRON işine sahip olmak olacaktır.
Pete

3
Çok faydalı teşekkürler. Bu cronjob kullanıyorum0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Matthieu

10

İşte DNS round-robin kullandığınızı varsayarsak, tüm sunucularınızı kontrol eden bir bash işlevi. Bunun GNU tarihi gerektirdiğini ve Mac OS'de çalışmadığını unutmayın

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
}

Çıktı örneği:

$ 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

Şaşırtıcı osx 10.13.4 kabuk çalışır Tamam (beni yargılama Sadece ben app app bir uygulama itmek için bugün osx üzerinde ... kısa bir süre linux için önyükleme ;-)
Scott Stensland 9:18

1
@ScottStensland Aşağıdakileri değerlendiriyoruz :-P. Mac'i çok kullanıyorum ama Linux gerçekten çok daha iyi.
Mike Q

Bu kod pasajı için çok teşekkür ederim! Ne sinir bozucu bir görev :), keşke openssl için bir unixtime zaman damgası bayrak olsaydı.
user1279741

1
Bir alpin linux kapsayıcısında olanlar için, expiry_datedeğerinizin saat dilimi adının sonuna kaldırılması gerekir. cutBunu yapmak için borunun sonuna bir ilave ekleyin :| cut -d ' ' -f 1-4
Droogans

5

Alan adı sertifikasının süresi bir süre sonra dolarsa doğru / yanlış değerini kontrol eden bir satır (ör. 15 gün):

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

2

MAC OSX (El Capitan) için Nicholas örneğinin bu modifikasyonu benim için çalıştı.

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

Örnek Çıktı:

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

macOS sistemimdeki --date=veya --iso-8601bayraklarından hoşlanmadı .


.Pem dosyalarını yapmadıysanız, ancak .cerApple Dev sitesinden yeni oluşturduğunuz ve indirdiğiniz sertifikalarınız olsaydı bunu nasıl yapardınız ?
Alex Zavatone

1

Kabul edilen cevapla aynı, ancak dosya konumunu bulamıyorsanız, sadece dosyayla .crtdeğil , dosyayla bile çalıştığını unutmayın ..pem.pem

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Sonuç:

notAfter=Mar 29 06:15:00 2020 GMT

0

Linux'ta bir GUI uygulaması kullanmak istiyorsanız (bir nedenden dolayı), kullanın gcr-viewer(çoğu dağıtımda paket tarafından yüklenir gcr(aksi takdirde pakette gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.