2014-01-23 113 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