Saya memiliki masalah yang sama dan menulis ini ... Cepat dan kotor, tetapi harus berhasil. Ini akan mencatat (dan mencetak ke layar dengan debugging aktif) semua sertifikat yang belum valid atau berakhir dalam 90 hari ke depan. Mungkin mengandung beberapa bug, tetapi merasa bebas untuk membereskannya.
#!/bin/sh
DEBUG=false
warning_days=90 # Number of days to warn about soon-to-expire certs
certs_to_check='serverA.test.co.uk:443
serverB.test.co.uk:8140
serverC.test.co.uk:443'
for CERT in $certs_to_check
do
$DEBUG && echo "Checking cert: [$CERT]"
output=$(echo | openssl s_client -connect ${CERT} 2>/dev/null |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |\
openssl x509 -noout -subject -dates 2>/dev/null)
if [ "$?" -ne 0 ]; then
$DEBUG && echo "Error connecting to host for cert [$CERT]"
logger -p local6.warn "Error connecting to host for cert [$CERT]"
continue
fi
start_date=$(echo $output | sed 's/.*notBefore=\(.*\).*not.*/\1/g')
end_date=$(echo $output | sed 's/.*notAfter=\(.*\)$/\1/g')
start_epoch=$(date +%s -d "$start_date")
end_epoch=$(date +%s -d "$end_date")
epoch_now=$(date +%s)
if [ "$start_epoch" -gt "$epoch_now" ]; then
$DEBUG && echo "Certificate for [$CERT] is not yet valid"
logger -p local6.warn "Certificate for $CERT is not yet valid"
fi
seconds_to_expire=$(($end_epoch - $epoch_now))
days_to_expire=$(($seconds_to_expire / 86400))
$DEBUG && echo "Days to expiry: ($days_to_expire)"
warning_seconds=$((86400 * $warning_days))
if [ "$seconds_to_expire" -lt "$warning_seconds" ]; then
$DEBUG && echo "Cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
logger -p local6.warn "cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
fi
done
Jika menggunakan OS X, Anda mungkin menemukan bahwa date
perintah tidak berfungsi dengan benar. Ini karena perbedaan dalam versi Unix dan Linux dari utilitas ini. Posting yang ditautkan memiliki opsi untuk membuat ini berfungsi.
-servername
argumen, seperti ini:openssl s_client -servername example.com -connect example.com:443
Cukup jalankan perintah di bawah ini dan itu akan memberikan tanggal kedaluwarsa:
Anda dapat menggunakan perintah ini ke file batch, untuk mengumpulkan informasi ini untuk server yang lebih jauh.
sumber
-servername
argumen, seperti ini:openssl s_client -servername google.com.br -connect google.com.br:443
Di bawah ini adalah skrip saya yang sebagai cek dalam nagios. Terhubung ke host tertentu, itu memverifikasi bahwa sertifikat itu valid dalam ambang batas yang ditetapkan oleh opsi -c / -w. Itu dapat memeriksa bahwa CN sertifikat cocok dengan nama yang Anda harapkan.
Anda perlu python openssl library, dan saya melakukan semua pengujian dengan python 2.7.
Akan sepele untuk memiliki panggilan skrip shell ini beberapa kali. Skrip mengembalikan nilai keluar nagios standar untuk status kritis / peringatan / ok.
Pemeriksaan sederhana atas sertifikat Google dapat dilakukan seperti ini.
check_ssl_certificate
sumber
get_pem
Hubungkan ke host: port, ekstrak sertifikat dengan sed dan tulis ke /tmp/host.port.pem.
get_expiration_date
Baca file pem yang diberikan dan evaluasi kunci notAfter sebagai variabel bash. Kemudian cetak nama file dan tanggal kapan berakhir di lokasi tertentu.
get_pem_expiration_dates
Iterasi beberapa file input dan jalankan fungsi di atas.
check.pems.sh
output sampel
Dan untuk menjawab pertanyaan Anda:
sumber
-servername
argumen, seperti ini:openssl s_client -servername example.com -connect example.com:443
Berikut ini adalah versi satu-baris dari jawaban yang diterima, yang hanya menampilkan sisa jumlah hari:
( export DOMAIN=example.com; echo $(( ( $(date +%s -d "$( echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | sed 's/.*notAfter=\(.*\)$/\1/g' )" ) - $(date +%s) ) / 86400 )) )
Contoh dengan www.github.com:
sumber
( ... )
sintaks subshell mungkin spesifik untuk Bash; Saya kira Anda menggunakan shell yang berbeda?Berikan daftar nama host dengan port 443 dalam format nama host: port dalam file dan berikan sebagai nama file.
! / bin / bash
nama file = / root / kns / certs
date1 = $ (date | cut -d "" -f2,3,6)
currentDate = $ (date -d "$ date1" + "% Y% m% d")
saat membaca -r line do
dcert = $ (echo | openssl s_client -servername $ line -connect $ line 2> / dev / null | openssl x509 -tidak ada-tanggal | grep notSetelah | cut -d = -f2)
echo Hostname: $ line endDate = $ (date -d "$ dcert" + "% Y% m% d")
d1 = $ (date -d "$ endDate" +% s) d2 = $ (date -d "$ currentDate" +% s) echo Nama Host: $ line - Sisa Sisa $ ((d1 - d2) / 86400))
echo $ dcert selesai <"$ filename"
sumber