如何从PEM编码的证书中确定SSL证书的到期日期?

GL2*_*014 278 bash ssl openssl certificate

如果我在Mac或Linux中有实际文件和Bash shell,我如何查询cert文件何时到期?假设我有csr,key,pem和chain文件,这不是一个网站,而是实际上是证书文件本身.

tha*_*guy 556

openssl:

openssl x509 -enddate -noout -in file.pem
Run Code Online (Sandbox Code Playgroud)

输出在表单上:

notAfter=Nov  3 22:23:50 2014 GMT
Run Code Online (Sandbox Code Playgroud)

另请参阅MikeW的答案,了解如何轻松检查证书是否已过期,或者是否在一定时间内,无需解析上述日期.

  • 您还可以在`x509`实用程序中内置`-startdate`和`-enddate`选项.他们会为你节省`grep`. (18认同)
  • 如果文件不是 pem 格式,这也适用。适用于 server.crt (3认同)

Mik*_*keW 146

如果您只想知道证书是否已过期(或将在接下来的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
Run Code Online (Sandbox Code Playgroud)

这节省了必须自己进行日期/时间比较.

openssl0如果证书尚未过期,将返回退出代码(零),并且在上面的示例中,将不会在接下来的86400秒内返回退出代码.如果证书已经过期或已经过期 - 或者其他错误,如无效/不存在的文件 - 返回代码是1.

(当然,它假定时间/日期设置正确)

  • 要确定证书当前是否过期,请使用零秒的持续时间。省略`-noout`选项可以使用单个命令查看有用的消息,而无需额外的逻辑。例如,“ openssl x509 -checkend 0 -in file.pem”将给出输出“证书将过期”或“证书将不过期”,指示证书是否将在零秒后过期。 (6认同)

Rah*_*ava 29

命令:

# cat {key_name} | openssl x509 -noout -enddate
Example: # cat tower.cert | openssl x509 -noout -enddate
Run Code Online (Sandbox Code Playgroud)

结果:

notAfter=Dec  7 04:03:32 2023 GMT
Run Code Online (Sandbox Code Playgroud)


Nic*_*kin 18

这是我的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
Run Code Online (Sandbox Code Playgroud)

样本输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 非常有用,谢谢.我用这个cronjob`0 7**1 /path/to/cert.sh | mail -s"certbot"my @ email.com` (3认同)

Sri*_*nth 16

与接受的答案相同,但请注意,它甚至适用于.crt文件而不仅仅是.pem文件,以防万一您无法找到.pem文件位置。

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Run Code Online (Sandbox Code Playgroud)

结果:

notAfter=Mar 29 06:15:00 2020 GMT
Run Code Online (Sandbox Code Playgroud)


And*_*rew 8

这是一个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
}
Run Code Online (Sandbox Code Playgroud)

输出示例:

$ 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
Run Code Online (Sandbox Code Playgroud)


Ale*_*xey 5

如果域证书将在一段时间后过期(例如 15 天),则一行检查真/假:

openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect my.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
if [ $? -eq 0 ]; then
  echo 'good'
else
  echo 'bad'
fi
Run Code Online (Sandbox Code Playgroud)