Câu trả lời:
Với openssl
:
openssl x509 -enddate -noout -in file.pem
Đầu ra có dạng:
notAfter=Nov 3 22:23:50 2014 GMT
Đồng thời xem câu trả lời của MikeW để biết cách dễ dàng kiểm tra xem chứng chỉ đã hết hạn hay chưa, hoặc liệu nó sẽ trong một khoảng thời gian nhất định, mà không phải phân tích ngày ở trên.
Nếu bạn chỉ muốn biết liệu chứng chỉ đã hết hạn (hoặc sẽ làm như vậy trong vòng N giây tiếp theo), -checkend <seconds>
tùy chọn openssl x509
sẽ cho bạn biết:
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
Điều này tiết kiệm việc phải tự so sánh ngày / giờ.
openssl
sẽ trả về mã thoát là 0
(không) nếu chứng chỉ chưa hết hạn và sẽ không làm như vậy trong 86400 giây tiếp theo, trong ví dụ trên. Nếu chứng chỉ sẽ hết hạn hoặc đã được thực hiện - hoặc một số lỗi khác như tệp không hợp lệ / không tồn tại - mã trả về là 1
.
(Tất nhiên, nó giả sử thời gian / ngày được đặt chính xác)
-noout
tùy chọn để xem một thông báo hữu ích bằng cách sử dụng một lệnh duy nhất mà không cần thêm logic. Ví dụ: openssl x509 -checkend 0 -in file.pem
sẽ cung cấp đầu ra "Chứng chỉ sẽ hết hạn" hoặc "Chứng chỉ sẽ không hết hạn" cho biết liệu chứng chỉ sẽ hết hạn sau 0 giây.
Đây là dòng lệnh bash của tôi để liệt kê nhiều chứng chỉ theo thứ tự hết hạn, gần đây nhất là hết hạn trước.
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
Đầu ra mẫu:
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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Đây là một hàm bash để kiểm tra tất cả các máy chủ của bạn, giả sử bạn đang sử dụng vòng tròn DNS. Lưu ý rằng điều này yêu cầu ngày GNU và sẽ không hoạt động trên 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
}
Ví dụ đầu ra:
$ 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
expiry_date
giá trị của bạn sẽ cần phải xóa tên múi giờ khỏi phần cuối của nó. Thêm một bổ sung cut
vào cuối đường ống để làm điều này:| cut -d ' ' -f 1-4
Một dòng kiểm tra đúng / sai nếu chứng chỉ tên miền sẽ hết hạn trong một thời gian sau (ví dụ: 15 ngày):
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
Đối với MAC OSX (El Capitan) Việc sửa đổi ví dụ này của Nicholas đã có hiệu quả với tôi.
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
Đầu ra mẫu:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
macOS không thích --date=
hoặc --iso-8601
cờ trên hệ thống của tôi.
.cer
certs bạn vừa thực hiện và tải xuống từ trang Apple Dev?
Tương tự như câu trả lời được chấp nhận, nhưng lưu ý rằng nó hoạt động ngay cả với .crt
tệp và không chỉ .pem
tệp, chỉ trong trường hợp nếu bạn không thể tìm thấy .pem
vị trí tệp.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Kết quả:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
và-enddate
các tùy chọn được tích hợp trongx509
tiện ích. Họ sẽ cứu bạngrep
.