2014-01-23 110 views
167

如果我在Mac或Linux中有實際的文件和Bash shell,我該如何查詢證書文件何時會過期?不是一個網站,而是實際上證書文件本身,假設我有csr,key,pem和chain文件。如何從PEM編碼證書確定SSL證書過期日期?

+2

Stack Overflow是用於編程和發展問題的站點。這個問題似乎是無關緊要的,因爲它不是關於編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306)。 – jww

回答

345

隨着openssl

openssl x509 -enddate -noout -in file.pem 

輸出爲形式:

notAfter=Nov 3 22:23:50 2014 GMT 

另見MikeW's answer對於如何輕鬆地檢查證書是否過期與否,或者是否會在一一定的時間段,而不必解析上述日期。

+6

你da炸彈。 。 。花花公子。 – GL2014

+8

您還可以在'x509'實用程序中內置'-startdate'和'-enddate'選項。他們會爲你節省'grep'。 – jww

+0

感謝您的親切推薦!但我們有興趣互相幫助... – MikeW

92

如果你只是想知道證書是否已過期(或將在未來的N秒內這樣做),則-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

(當然,它假定時間/日期設置是否正確)

+0

要確定證書是否當前過期,請使用零秒持續時間。省略「-noout」選項可使用單個命令查看有用的消息,而無需額外的邏輯。例如,'openssl x509 -checkend 0 -in file.pem'將輸出「證書將過期」或「證書不會過期」,指示證書是否將在零秒內到期。 –

7

這裏是我的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

非常好!這就是我所追求的。現在我對不久將要續約的證書進行概述。將它保存爲我的主文件夾中的checkcerts.sh,以便我可以定期檢查它。接下來的事情是讓CRON的工作每個月檢查一次,併發送需要續約的證書。 – Pete

+1

非常有用的感謝。我使用這個cronjob'0 7 * * 1 /path/to/cert.sh | mail -s「certbot」my @ email.com' – Matthieu

2

對於MAC OSX(埃爾卡皮坦)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標誌。

+0

如果您沒有製作.pem文件,但是您剛剛製作並從Apple Dev站點下載了'.cer'證書,您將如何做到這一點? –

1

這是一個bash函數,用於檢查所有服務器,假設您使用的是DNS循環。注意,這需要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