Làm cách nào để xác định ngày hết hạn chứng chỉ SSL từ chứng chỉ được mã hóa PEM?


327

Nếu tôi có tệp thực tế và vỏ Bash trong Mac hoặc Linux, làm cách nào tôi có thể truy vấn tệp cert khi hết hạn? Không phải là một trang web, nhưng thực sự là tệp chứng chỉ, giả sử tôi có các tệp csr, key, pem và chain.

Câu trả lời:


630

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.


19
Bạn cũng có -startdate-enddatecác tùy chọn được tích hợp trong x509tiện ích. Họ sẽ cứu bạn grep.
jww

2
Điều này cũng hoạt động nếu tập tin không ở định dạng pem. hoạt động tốt cho server.crt
xem

163

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 x509sẽ 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ờ.

opensslsẽ 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)


8
Để xác định xem chứng chỉ hiện đã hết hạn hay chưa, hãy sử dụng thời lượng 0 giây. Bỏ -noouttù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.pemsẽ 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.
LS

1
Cảm ơn! Đây chính xác là những gì tôi cần! Với mã thoát, nó sẽ tạo ra một chương trình nhỏ hơn / sạch hơn.
Lon Kaut

24

Đâ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

Rất đẹp! Đây là những gì tôi đã sau. Bây giờ tôi có một cái nhìn tổng quan về các chứng nhận mà tôi phải gia hạn sớm. Đã lưu nó dưới dạng checkcerts.sh trong thư mục nhà của tôi để tôi có thể kiểm tra nó thường xuyên. Điều tiếp theo sẽ là có một công việc CRON để kiểm tra hàng tháng và gửi email các chứng chỉ cần gia hạn.
Pete

3
Rất hữu ích cảm ơn. Tôi sử dụng cronjob này0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Matthieu

10

Đâ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

đáng ngạc nhiên OSX 10.13.4 chạy vỏ OK (đừng phán xét tôi Tôi chỉ trên OSX ngày hôm nay để đẩy một ứng dụng để app store ... khởi động lại để linux ngay ;-)
Scott Stensland

1
@ScottStensland Chúng tôi đang đánh giá :-P. Tôi sử dụng Mac rất nhiều nhưng Linux thực sự tốt hơn nhiều.
Mike Q

Cảm ơn bạn rất nhiều vì đoạn mã đó! Thật là một nhiệm vụ khó chịu :), tôi ước có một cờ dấu thời gian unixtime cho openssl.
dùng1279741

1
Đối với những người bạn trên một thùng chứa linux trên núi cao, expiry_dategiá 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 cutvào cuối đường ống để làm điều này:| cut -d ' ' -f 1-4
Dropogans

5

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

2

Đố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-8601cờ trên hệ thống của tôi.


Bạn sẽ làm điều này như thế nào nếu bạn chưa tạo các tệp .pem, nhưng chỉ có các .cercerts bạn vừa thực hiện và tải xuống từ trang Apple Dev?
Alex Zavatone

1

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 .crttệp và không chỉ .pemtệp, chỉ trong trường hợp nếu bạn không thể tìm thấy .pemvị trí tệp.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Kết quả:

notAfter=Mar 29 06:15:00 2020 GMT

0

Nếu (vì một số lý do) bạn muốn sử dụng ứng dụng GUI trong Linux, hãy sử dụng gcr-viewer(trong hầu hết các bản phân phối, nó được cài đặt bởi gói gcr(nếu không là trong gói gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.