Bagaimana cara menentukan tanggal kedaluwarsa sertifikat SSL dari sertifikat yang disandikan dengan PEM?

327

Jika saya memiliki file aktual dan Bash shell di Mac atau Linux, bagaimana saya bisa meminta file cert kapan akan kedaluwarsa? Bukan situs web, tetapi sebenarnya file sertifikat itu sendiri, dengan asumsi saya memiliki file csr, key, pem dan chain.

GL2014
sumber

Jawaban:

630

dengan openssl:

openssl x509 -enddate -noout -in file.pem

Outputnya ada di formulir:

notAfter=Nov  3 22:23:50 2014 GMT

Lihat juga jawaban MikeW untuk cara memeriksa dengan mudah apakah sertifikat telah kedaluwarsa atau belum, atau apakah akan dalam jangka waktu tertentu, tanpa harus menguraikan tanggal di atas.

pria lain itu
sumber
19
Anda juga memiliki opsi -startdatedan -enddatedibangun ke dalam x509utilitas. Mereka akan menyelamatkan Anda grep.
jww
2
ini juga berfungsi jika file tidak dalam format pem. berfungsi dengan baik untuk server.crt
lihat
163

Jika Anda hanya ingin tahu apakah sertifikat telah kedaluwarsa (atau akan melakukannya dalam N detik berikutnya), -checkend <seconds>opsi untuk openssl x509akan memberi tahu Anda:

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

Ini menghemat harus melakukan perbandingan tanggal / waktu sendiri.

opensslakan mengembalikan kode keluar 0(nol) jika sertifikat belum kedaluwarsa dan tidak akan melakukannya untuk 86400 detik berikutnya, dalam contoh di atas. Jika sertifikat telah kedaluwarsa atau sudah melakukannya - atau kesalahan lain seperti file tidak valid / tidak ada - kode pengembaliannya 1.

(Tentu saja, ini mengasumsikan waktu / tanggal diatur dengan benar)

MikeW
sumber
8
Untuk menentukan apakah sertifikat saat ini kedaluwarsa, gunakan durasi nol detik. Hapus -nooutopsi untuk melihat pesan bermanfaat menggunakan satu perintah tanpa logika tambahan. Misalnya, openssl x509 -checkend 0 -in file.pemakan memberikan output "Sertifikat akan kedaluwarsa" atau "Sertifikat tidak akan kedaluwarsa" yang menunjukkan apakah sertifikat akan kedaluwarsa dalam nol detik.
LS
1
Terima kasih! Inilah yang saya butuhkan! Dengan kode keluar, itu akan membuat program yang jauh lebih kecil / bersih.
Lon Kaut
24

Inilah baris perintah bash saya untuk mencantumkan beberapa sertifikat agar kedaluwarsa, yang paling baru kedaluwarsa terlebih dahulu.

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

Output sampel:

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
sumber
Sangat bagus! Inilah yang saya cari. Sekarang saya memiliki ikhtisar sertifikat yang harus segera saya perbarui. Disimpan sebagai checkcerts.sh di folder rumah saya sehingga saya bisa memeriksanya secara teratur. Hal berikutnya adalah memiliki pekerjaan CRON untuk memeriksa setiap bulan dan mengirim email sertifikat yang perlu diperbarui.
Pete
3
Terima kasih banyak. Saya menggunakan cronjob ini0 7 * * 1 /path/to/cert.sh | mail -s "certbot" [email protected]
Matthieu
10

Inilah fungsi bash yang memeriksa semua server Anda, dengan asumsi Anda menggunakan DNS round-robin. Perhatikan bahwa ini memerlukan tanggal GNU dan tidak akan berfungsi di 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
}

Contoh keluaran:

$ 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
Andrew
sumber
mengherankan osx 10.13.4 menjalankan shell Anda OK (jangan menilai saya, saya hanya di osx hari ini untuk mendorong aplikasi ke app store ... segera kembali ke linux ;-)
Scott Stensland
1
@ScottStensland Kami menilai :-P. Saya banyak menggunakan Mac tetapi Linux benar-benar jauh lebih baik.
Mike Q
Terima kasih banyak untuk potongan kode itu! Apa tugas yang menyebalkan :), saya berharap ada tanda waktu cap waktu unixtime untuk openssl.
user1279741
1
Bagi Anda yang menggunakan wadah alpine linux, expiry_datenilai Anda perlu menghapus nama zona waktu dari ujungnya. Tambahkan tambahan cutke ujung pipa untuk melakukan ini:| cut -d ' ' -f 1-4
Droogans
5

Satu baris memeriksa benar / salah jika sertifikat domain akan kedaluwarsa dalam beberapa waktu kemudian (mis. 15 hari):

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
sumber
2

Untuk MAC OSX (El Capitan) Modifikasi contoh Nicholas ini bekerja untuk saya.

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

Output sampel:

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

macOS tidak suka --date=atau --iso-8601menandai pada sistem saya.

Donald.M
sumber
Bagaimana Anda melakukan ini jika Anda tidak membuat file .pem, tetapi hanya memiliki .cersertifikat yang baru saja Anda buat dan unduh dari situs Apple Dev?
Alex Zavatone
1

Sama seperti jawaban yang diterima, Tetapi perhatikan bahwa ia berfungsi bahkan dengan .crtfile dan bukan hanya .pemfile, untuk berjaga-jaga jika Anda tidak dapat menemukan .pemlokasi file.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Hasil:

notAfter=Mar 29 06:15:00 2020 GMT
Srihari Karanth
sumber
0

Jika (karena alasan tertentu) Anda ingin menggunakan aplikasi GUI di Linux, gunakan gcr-viewer(di sebagian besar distribusi diinstal oleh paket gcr(jika tidak dalam paket gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Attila123
sumber