จะกำหนดวันหมดอายุใบรับรอง SSL จากใบรับรองที่เข้ารหัส PEM ได้อย่างไร


326

หากฉันมีไฟล์จริงและ Bash shell ใน Mac หรือ Linux ฉันจะค้นหาไฟล์ใบรับรองได้อย่างไรว่าจะหมดอายุเมื่อใด ไม่ใช่เว็บไซต์ แต่จริงๆแล้วไฟล์ใบรับรองนั้นสมมติว่าฉันมีไฟล์ csr, key, pem และ chain

คำตอบ:


630

ด้วยopenssl:

openssl x509 -enddate -noout -in file.pem

เอาต์พุตอยู่ในรูปแบบ:

notAfter=Nov  3 22:23:50 2014 GMT

ดูคำตอบของ MikeWสำหรับวิธีตรวจสอบว่าใบรับรองหมดอายุหรือไม่หรือว่าจะภายในระยะเวลาหนึ่งโดยไม่ต้องแยกวันที่ด้านบน


19
นอกจากนี้คุณยังมี-startdateและ-enddateตัวเลือกในx509ยูทิลิตี้ grepพวกเขาจะช่วยให้คุณประหยัด
jww

2
ยังใช้งานได้หากไฟล์ไม่อยู่ในรูปแบบ pem ทำงานได้ดีสำหรับ server.crt
ดู

163

หากคุณเพียงแค่ต้องการทราบว่าใบรับรองหมดอายุ (หรือจะทำภายในไม่กี่วินาทีถัดไป) -checkend <seconds>ตัวเลือกที่openssl x509จะบอกคุณ:

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

สิ่งนี้ช่วยให้ไม่ต้องทำการเปรียบเทียบวันที่ / เวลาด้วยตัวคุณเอง

opensslจะส่งคืนรหัสทางออกของ0(ศูนย์) หากใบรับรองยังไม่หมดอายุและจะไม่ทำเช่นนั้นสำหรับ 86400 วินาทีถัดไปในตัวอย่างด้านบน หากใบรับรองจะหมดอายุหรือได้ทำมาแล้วดังนั้น - หรือบางข้อผิดพลาดอื่น ๆ เช่นการที่ไม่ถูกต้อง / ไฟล์ที่ไม่มีอยู่ - 1รหัสส่งกลับเป็น

(แน่นอนมันถือว่าเวลา / วันที่ตั้งอย่างถูกต้อง)


8
หากต้องการตรวจสอบว่าใบรับรองหมดอายุหรือไม่ให้ใช้ระยะเวลาเป็นศูนย์วินาที งด-nooutตัวเลือกเพื่อดูข้อความที่เป็นประโยชน์โดยใช้คำสั่งเดียวโดยไม่มีตรรกะเพิ่มเติม เช่นopenssl x509 -checkend 0 -in file.pemจะให้ผลลัพธ์ "ใบรับรองจะหมดอายุ" หรือ "ใบรับรองจะไม่หมดอายุ" ซึ่งระบุว่าใบรับรองจะหมดอายุในไม่กี่วินาที
LS

1
ขอบคุณ! นี่คือสิ่งที่ฉันต้องการ! ด้วยรหัสทางออกมันจะทำให้โปรแกรมเล็กลง / ทำความสะอาดมากขึ้น
Lon Kaut

24

นี่คือบรรทัดคำสั่ง bash ของฉันเพื่อแสดงรายการใบรับรองหลายใบตามลำดับการหมดอายุโดยล่าสุดจะหมดอายุก่อน

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

ตัวอย่างผลลัพธ์:

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

ดีมาก! นี่คือสิ่งที่ฉันเป็นหลังจากนั้น ตอนนี้ฉันมีภาพรวมของหนังสือรับรองที่ฉันต้องต่ออายุเร็ว ๆ นี้ บันทึกไว้เป็น checkcerts.sh ในโฟลเดอร์บ้านของฉันเพื่อให้ฉันสามารถตรวจสอบได้อย่างสม่ำเสมอ สิ่งต่อไปคือการมีงาน CRON เพื่อตรวจสอบทุกเดือนและส่งอีเมลใบรับรองที่ต้องต่ออายุ
Pete

3
ขอบคุณมากที่มีประโยชน์ ฉันใช้ cronjob นี้0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Matthieu

10

นี่คือฟังก์ชั่นทุบตีซึ่งจะตรวจสอบเซิร์ฟเวอร์ทั้งหมดของคุณโดยสมมติว่าคุณใช้ DNS round-robin โปรดทราบว่านี่ต้องใช้วันที่ของ GNU และจะไม่ทำงานบน 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
}

ตัวอย่างผลลัพธ์:

$ 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

osx 10.13.4 รันเชลล์ของคุณอย่างน่าประหลาดใจตกลง (อย่าตัดสินฉันว่าฉันแค่ osx ในวันนี้เท่านั้นที่จะผลักดันแอพไปที่ app store ... การบูตกลับไปที่ linux ในไม่ช้า ;-)
Scott Stensland

1
@ScottStensland เรากำลังตัดสิน :-P ฉันใช้ Mac บ่อย แต่ลีนุกซ์ดีกว่ามาก
Mike Q

ขอบคุณมากสำหรับ snippit รหัสนั้น! ช่างเป็นงานที่น่ารำคาญ :) ฉันหวังว่าจะมีการประทับเวลาแบบไม่ต่อเนื่องสำหรับ openssl
user1279741

1
สำหรับผู้ที่อยู่ในคอนเทนเนอร์อัลไพน์ลินุกซ์expiry_dateค่าของคุณจะต้องมีการลบชื่อเขตเวลาออกจากจุดสิ้นสุด เพิ่มcutส่วนท้ายของท่อเพื่อทำสิ่งนี้:| cut -d ' ' -f 1-4
Droogans

5

การตรวจสอบหนึ่งบรรทัดเกี่ยวกับจริง / เท็จหากใบรับรองของโดเมนจะหมดอายุในเวลาต่อมา (เช่น 15 วัน):

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) ตัวอย่างการเปลี่ยนแปลงของ Nicholas นี้ใช้ได้สำหรับฉัน

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

ตัวอย่างผลลัพธ์:

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

macOS ไม่ชอบ--date=หรือตั้ง--iso-8601ค่าสถานะในระบบของฉัน


คุณจะทำอย่างไรถ้าคุณไม่ได้สร้างไฟล์. pem แต่เพิ่งมี.cercerts ที่คุณเพิ่งสร้างและดาวน์โหลดจากเว็บไซต์ Apple Dev
Alex Zavatone

1

เช่นเดียวกับคำตอบที่ยอมรับ แต่โปรดทราบว่ามันทำงานได้แม้กับ.crtไฟล์และไม่ใช่แค่.pemไฟล์เท่านั้นในกรณีที่คุณไม่สามารถค้นหา.pemตำแหน่งไฟล์ได้

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

ผลลัพธ์:

notAfter=Mar 29 06:15:00 2020 GMT

0

ถ้า (ด้วยเหตุผลบางอย่าง) คุณต้องการใช้แอปพลิเคชั่น GUI ใน Linux ให้ใช้gcr-viewer(ในการแจกแจงส่วนใหญ่จะถูกติดตั้งโดยแพคเกจgcr(มิฉะนั้นในแพ็คเกจgcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.