我想从运行在标准Ubuntu 14.04服务器上的bash脚本中检查一个网站的证书的有效期是多少天。我已经知道可以使用openssl来获取目标日期
$ echo | openssl s_client -connect google.com:443 2>/dev/null|openssl x509 -noout -enddate notAfter=Dec 22 16:37:00 2016 GMT
但是我该如何解析结果日期并减去当前日期呢?或者有没有更好的解决方案?
ezykj2lf1#
仅在单行中
echo "(" $(date -d "`openssl x509 -in /etc/letsencrypt/live/d-herrmann.de/cert.pem -text -noout | grep "Not After" | cut -c 25-`" +%s) - $(date -d "now" +%s) ")" / 86400 | bc
wswtfjt72#
使用GNU date的%j来获取一年中的日期,并进行减法运算:
date
%j
$ echo $(( $(date -d "$(cut -d= -f2 <(echo 'notAfter=Dec 22 16:37:00 2016 GMT'))" '+%j') - $(date '+%j'))) 73
$(date -d "$(cut -d= -f2 <(echo 'notAfter=Dec 22 16:37:00 2016 GMT'))" '+%j')
<(echo 'notAfter=Dec 22 16:37:00 2016 GMT')
echo
openssl
$(date '+%j')
$(())
esbemjvw3#
date1="Dec 22 16:37:00 2016 GMT" # Future date date2=$(date) # Current date diff=$(($(date -d "$date1" +%j)-$(date -d "$date2" +%j))) #Diff between two date, %j is to show day of the year. echo $diff #Display difference 73
或者只用一行:
echo $(($(date -d "Dec 22 16:37:00 2016 GMT" +%j)-$(date +%j))) 73
iszxjhcz4#
下面是一个小脚本,它返回days、hours或minutes证书仍然有效,我只是将其保存在可执行文件中,例如check_cert_age.sh
days
hours
minutes
check_cert_age.sh
#!/bin/bash # input domain as first parameter eg. ./heck_cert_age.sh stackoverflow.com input="$1" domain=$(echo "$input" | sed -e 's|^[^/]*//||' -e 's|/.*$||') #domain=stackoverflow.com echo echo "Check the cert of Domain $domain" datetime=$(timeout 5 openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -dates | sed 's/notAfter=\(.*\)$/\1/' | tail -n1) if [ -z "$datetime" ]; then echo echo "ERROR" echo exit 0 fi localtime=$(date -d "${datetime}" '+%R') localdate=$(date -d "${datetime}" '+%Y-%m-%d') timestamp=$(date -d "${datetime}" '+%s') now=$(date '+%s') diff=$((($timestamp-$now)/60)) if [ "$diff" -gt 3599 ] || [ "$diff" -lt 3599 ]; then diffstr="$(expr $diff / 60 / 24) days" elif [ "$diff" -gt 59 ] || [ "$diff" -lt 59 ] ; then diffstr="$(expr $diff / 60) h" else diffstr="$diff min" fi echo echo "The cert is valid until $localdate at $localtime ($diffstr)" echo
输出将为:检查域名www.example.com的证书stackoverflow.com证书有效期至2023年2月1日15:10(50天)输出在days、hours、minutes中产生差异,并且知道与本地时区的差异。对于分钟,它看起来例如像这样:检查域名www.example.com的证书ssl-cert-almost-expired.com证书有效期至2022年12月13日15:39(34分钟)
4条答案
按热度按时间ezykj2lf1#
仅在单行中
wswtfjt72#
使用GNU
date
的%j
来获取一年中的日期,并进行减法运算:$(date -d "$(cut -d= -f2 <(echo 'notAfter=Dec 22 16:37:00 2016 GMT'))" '+%j')
从我们获得的日期中获取一年中的哪一天,将进程替换<(echo 'notAfter=Dec 22 16:37:00 2016 GMT')
中的echo
命令替换为您最初使用的openssl
命令$(date '+%j')
将今天的日期作为一年中的某一天$(())
用于减去整数esbemjvw3#
或者只用一行:
iszxjhcz4#
下面是一个小脚本,它返回
days
、hours
或minutes
证书仍然有效,我只是将其保存在可执行文件中,例如check_cert_age.sh
输出将为:
检查域名www.example.com的证书stackoverflow.com
证书有效期至2023年2月1日15:10(50天)
输出在
days
、hours
、minutes
中产生差异,并且知道与本地时区的差异。对于分钟,它看起来例如像这样:检查域名www.example.com的证书ssl-cert-almost-expired.com
证书有效期至2022年12月13日15:39(34分钟)