【问题标题】:How to determine SSL cert expiration date from a PEM encoded certificate?如何从 PEM 编码证书中确定 SSL 证书到期日期?
【发布时间】:2014-02-13 09:24:18
【问题描述】:

如果我在 Mac 或 Linux 中有实际文件和 Bash shell,我如何查询证书文件的到期时间?不是网站,而是证书文件本身,假设我有 csr、key、pem 和链文件。

【问题讨论】:

    标签: linux bash ssl openssl certificate


    【解决方案1】:

    命令:

    # cat {key_name} | openssl x509 -noout -enddate
    Example: # cat tower.cert | openssl x509 -noout -enddate
    

    结果:

    notAfter=Dec  7 04:03:32 2023 GMT
    

    【讨论】:

      【解决方案2】:

      我已经制作了一个相关的 bash 脚本来检查证书是否过期。如果需要,您可以使用相同的。

      脚本

      https://github.com/zeeshanjamal16/usefulScripts/blob/master/sslCertificateExpireCheck.sh

      自述文件

      https://github.com/zeeshanjamal16/usefulScripts/blob/master/README.md

      【讨论】:

        【解决方案3】:

        如果您只想知道证书是否已过期(或将在接下来的 N 秒内过期),openssl x509-checkend <seconds> 选项会告诉您:

        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

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

        请注意,旧版本的 openssl 有一个错误,这意味着如果 checkend 中指定的时间太大,将始终返回 0 (https://github.com/openssl/openssl/issues/6180)。

        【讨论】:

        • 要确定证书当前是否过期,请使用零秒的持续时间。省略 -noout 选项可使用单个命令查看有用的消息,无需额外逻辑。例如,openssl x509 -checkend 0 -in file.pem 将给出输出“证书将过期”或“证书不会过期”指示证书是否会在零秒内过期。
        • 为 -checkend 提供 > 30 年 (922752000) 的值会导致选项出现意外行为(即使证书在此时间范围内过期,也会返回 0)。
        【解决方案4】:

        如果域证书将在一段时间后(例如 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
        

        【讨论】:

          【解决方案5】:

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

          openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
          

          结果:

          notAfter=Mar 29 06:15:00 2020 GMT
          

          【讨论】:

            【解决方案6】:

            如果(出于某种原因)您想在 Linux 中使用 GUI 应用程序,请使用 gcr-viewer(在大多数发行版中,它由包 gcr 安装(否则在包 gcr-viewer 中))

            gcr-viewer file.pem
            # or
            gcr-viewer file.crt
            

            【讨论】:

              【解决方案7】:

              这是一个检查所有服务器的 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
              

              【讨论】:

              • 令人惊讶的是 osx 10.13.4 可以正常运行你的 shell(不要评判我,我今天只在 osx 上将应用程序推送到应用程序商店......很快就会启动回 linux ;-)
              • @ScottStensland 我们正在评判:-P。我经常使用 Mac,但 Linux 确实要好得多。
              • 非常感谢您提供的代码片段!多么烦人的任务 :),我希望 openssl 有一个 unixtime 时间戳标志。
              • 对于那些使用 alpine linux 容器的人,您的 expiry_date 值需要从其末尾删除时区名称。在管道末尾添加一个额外的cut 以执行此操作:| cut -d ' ' -f 1-4
              【解决方案8】:

              对于 MAC OSX (El Capitan) 这个 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 标志。

              【讨论】:

              • 如果您没有制作 .pem 文件,而只是拥有刚刚制作并从 Apple Dev 站点下载的 .cer 证书,您将如何做到这一点?
              【解决方案9】:

              这是我的 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
              

              【讨论】:

              • 非常好!这就是我所追求的。现在,我对必须尽快更新的证书进行了概述。将它作为 checkcerts.sh 保存在我的主文件夹中,以便我可以定期检查它。接下来的事情是让 CRON 工作每月检查并通过电子邮件发送需要更新的证书。
              • 非常有用,谢谢。我使用这个 cronjob 0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
              【解决方案10】:

              openssl:

              openssl x509 -enddate -noout -in file.pem
              

              输出在表单上:

              notAfter=Nov  3 22:23:50 2014 GMT
              

              另请参阅MikeW's answer,了解如何轻松检查证书是否已过期,或者是否会在某个时间段内,而无需解析上述日期。

              【讨论】:

              • 您还可以在x509 实用程序中内置-startdate-enddate 选项。他们会为您保存grep
              • 如果文件不是 pem 格式,这也有效。适用于 server.crt
              猜你喜欢
              • 2015-04-07
              • 2023-04-07
              • 2020-05-20
              • 2012-03-29
              • 2012-03-23
              • 2019-11-08
              • 2014-10-14
              • 1970-01-01
              相关资源
              最近更新 更多