ssl 从bash脚本中确定证书仍然有效的天数

5n0oy7gb  于 2022-12-19  发布在  其他
关注(0)|答案(4)|浏览(155)

我想从运行在标准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

但是我该如何解析结果日期并减去当前日期呢?或者有没有更好的解决方案?

ezykj2lf

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
wswtfjt7

wswtfjt72#

使用GNU 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')将今天的日期作为一年中的某一天
  • $(())用于减去整数
esbemjvw

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
iszxjhcz

iszxjhcz4#

下面是一个小脚本,它返回dayshoursminutes证书仍然有效,我只是将其保存在可执行文件中,例如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天)
输出在dayshoursminutes中产生差异,并且知道与本地时区的差异。对于分钟,它看起来例如像这样:
检查域名www.example.com的证书ssl-cert-almost-expired.com
证书有效期至2022年12月13日15:39(34分钟)

相关问题