หากฉันมีไฟล์จริงและ Bash shell ใน Mac หรือ Linux ฉันจะค้นหาไฟล์ใบรับรองได้อย่างไรว่าจะหมดอายุเมื่อใด ไม่ใช่เว็บไซต์ แต่จริงๆแล้วไฟล์ใบรับรองนั้นสมมติว่าฉันมีไฟล์ csr, key, pem และ chain
หากฉันมีไฟล์จริงและ Bash shell ใน Mac หรือ Linux ฉันจะค้นหาไฟล์ใบรับรองได้อย่างไรว่าจะหมดอายุเมื่อใด ไม่ใช่เว็บไซต์ แต่จริงๆแล้วไฟล์ใบรับรองนั้นสมมติว่าฉันมีไฟล์ csr, key, pem และ chain
คำตอบ:
ด้วยopenssl
:
openssl x509 -enddate -noout -in file.pem
เอาต์พุตอยู่ในรูปแบบ:
notAfter=Nov 3 22:23:50 2014 GMT
ดูคำตอบของ MikeWสำหรับวิธีตรวจสอบว่าใบรับรองหมดอายุหรือไม่หรือว่าจะภายในระยะเวลาหนึ่งโดยไม่ต้องแยกวันที่ด้านบน
หากคุณเพียงแค่ต้องการทราบว่าใบรับรองหมดอายุ (หรือจะทำภายในไม่กี่วินาทีถัดไป) -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
รหัสส่งกลับเป็น
(แน่นอนมันถือว่าเวลา / วันที่ตั้งอย่างถูกต้อง)
-noout
ตัวเลือกเพื่อดูข้อความที่เป็นประโยชน์โดยใช้คำสั่งเดียวโดยไม่มีตรรกะเพิ่มเติม เช่นopenssl x509 -checkend 0 -in file.pem
จะให้ผลลัพธ์ "ใบรับรองจะหมดอายุ" หรือ "ใบรับรองจะไม่หมดอายุ" ซึ่งระบุว่าใบรับรองจะหมดอายุในไม่กี่วินาที
นี่คือบรรทัดคำสั่ง 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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
นี่คือฟังก์ชั่นทุบตีซึ่งจะตรวจสอบเซิร์ฟเวอร์ทั้งหมดของคุณโดยสมมติว่าคุณใช้ 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
expiry_date
ค่าของคุณจะต้องมีการลบชื่อเขตเวลาออกจากจุดสิ้นสุด เพิ่มcut
ส่วนท้ายของท่อเพื่อทำสิ่งนี้:| cut -d ' ' -f 1-4
การตรวจสอบหนึ่งบรรทัดเกี่ยวกับจริง / เท็จหากใบรับรองของโดเมนจะหมดอายุในเวลาต่อมา (เช่น 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
สำหรับ 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
ค่าสถานะในระบบของฉัน
.cer
certs ที่คุณเพิ่งสร้างและดาวน์โหลดจากเว็บไซต์ Apple Dev
เช่นเดียวกับคำตอบที่ยอมรับ แต่โปรดทราบว่ามันทำงานได้แม้กับ.crt
ไฟล์และไม่ใช่แค่.pem
ไฟล์เท่านั้นในกรณีที่คุณไม่สามารถค้นหา.pem
ตำแหน่งไฟล์ได้
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
ผลลัพธ์:
notAfter=Mar 29 06:15:00 2020 GMT
ถ้า (ด้วยเหตุผลบางอย่าง) คุณต้องการใช้แอปพลิเคชั่น GUI ใน Linux ให้ใช้gcr-viewer
(ในการแจกแจงส่วนใหญ่จะถูกติดตั้งโดยแพคเกจgcr
(มิฉะนั้นในแพ็คเกจgcr-viewer
))
gcr-viewer file.pem
# or
gcr-viewer file.crt
-startdate
และ-enddate
ตัวเลือกในx509
ยูทิลิตี้grep
พวกเขาจะช่วยให้คุณประหยัด