สคริปต์เพื่อตรวจสอบว่าใบรับรอง SSL ถูกต้องหรือไม่


14

ฉันมีใบรับรอง SSL หลายใบและฉันต้องการรับการแจ้งเตือนเมื่อใบรับรองหมดอายุ

ความคิดของฉันคือการสร้าง cronjob ซึ่งรันคำสั่งง่ายๆทุกวัน

ฉันรู้ว่าopensslคำสั่งใน Linux สามารถใช้เพื่อแสดงข้อมูลใบรับรองของเซิร์ฟเวอร์ระยะไกลเช่น:

openssl s_client -connect www.google.com:443

แต่ฉันไม่เห็นวันหมดอายุในผลลัพธ์นี้ นอกจากนี้ผมต้องบอกเลิกคำสั่งนี้ด้วย+CTRLc

ฉันจะตรวจสอบการหมดอายุของใบรับรองระยะไกลจากสคริปต์ (ควรใช้openssl) และทำใน "โหมดแบทช์" เพื่อให้ทำงานโดยอัตโนมัติโดยไม่ต้องมีการโต้ตอบกับผู้ใช้?


4
ผมอยากจะแนะนำให้ส่ง servername ด้วย-servername www.google.comสำหรับ SNI เปิดการใช้งานเซิร์ฟเวอร์เพื่อหลีกเลี่ยงความจำเป็นสำหรับการยกเลิกส่ง / dev / โมฆะไป< /dev/null
SySS

ถ้าทำงาน Red Hat / CentOS ของคุณ / Fedora, มีลักษณะที่certmonger มันยังมีให้จากที่เก็บมาตรฐาน
JRFerguson

ฉันจะเพิ่มการตรวจสอบใบรับรองในเครื่องมือตรวจสอบเช่น nagios หรือ icinga
sebix

คำตอบ:


18

ตอนนี้คำสั่งของคุณคาดว่าจะมีคำขอ http เช่นGET index.phpเช่น ใช้สิ่งนี้แทน:

if true | openssl s_client -connect www.google.com:443 2>/dev/null | \
  openssl x509 -noout -checkend 0; then
  echo "Certificate is not expired"
else
  echo "Certificate is expired"
fi

  • true: เพิ่งจะไม่ป้อนข้อมูลตามด้วย eof ดังนั้น openssl จะออกหลังจากเชื่อมต่อ
    • openssl ...: คำสั่งจากคำถามของคุณ
    • 2>/dev/null: เอาต์พุตข้อผิดพลาดจะถูกละเว้น
  • openssl x509: เปิดใช้งานการจัดการข้อมูลใบรับรอง X.509
    • สิ่งนี้จะอ่านจากอินพุตมาตรฐานเป็นค่าเริ่มต้น
    • -noout: ไม่แสดงเอาต์พุตใบรับรองทั้งหมด
    • -checkend 0: ตรวจสอบว่าใบรับรองหมดอายุใน 0 วินาทีถัดไปหรือไม่

-checkendง่ายกว่าสคริปต์ที่ฉันพบว่ากำลังทำเลขคณิตวันที่!
Auspex

7

มันทำให้คุณได้รับใบรับรอง แต่ไม่ได้ถอดรหัส ถ้าคุณต้องการวันที่คุณจะไม่เห็น ดังนั้นสิ่งที่จำเป็นคือการที่คุณไพพ์ลงในx509แอปพลิเคชันของ OpenSSL เพื่อถอดรหัสใบรับรอง:

openssl s_client -connect www.example.com:443 \
    -servername www.example.com </dev/null |\
    openssl x509 -in /dev/stdin -noout -text

สิ่งนี้จะให้ใบรับรองที่ถอดรหัสเต็มรูปแบบกับ stdout รวมถึงวันที่มีผลบังคับใช้


3

หากคุณต้องการตรวจสอบวันหมดอายุขอบคุณบล็อกโพสต์นี้พบวิธีการค้นหาข้อมูลนี้กับข้อมูลที่เกี่ยวข้องอื่น ๆ ด้วยการโทรเพียงครั้งเดียว:

echo | openssl s_client -servername unix.stackexchange.com -connect unix.stackexchange.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

ผลลัพธ์ประกอบด้วยผู้ออกหัวเรื่อง (ซึ่งออกใบรับรอง) วันที่ออกและวันสุดท้ายที่หมดอายุ :

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
subject= /C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
notBefore=May 21 00:00:00 2016 GMT
notAfter=Aug 14 12:00:00 2019 GMT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.