从密钥工具证书中提取到期日期

Extracting an expiry date from a keytool certificate

我正在编写一个相当简单的脚本来从密钥工具证书中提取到期日期并将其与今天的日期进行比较,然后如果该日期少于 30 天则发送邮件。然而,我遇到的问题是如何使用 bash 提取到期日期,我是 运行:

keytool -list -v -keystore /usr/java/jdk1.8.0_301-amd64/jre/lib/security/cacerts -storepass <PWD> | grep "until:"

这将输出多行存储的所有证书如下:

Valid from: Tue May 26 01:00:00 IST 2015 until: Sun Jan 17 00:00:00 GMT 2038

计划是从行中获取到期(直到)日期并将其转换为纪元秒和天数以帮助在脚本中计算。

请你建议我继续的最佳方式。

首先,您需要将日期提取为字符串,这可以使用 awk 完成:

date=$(keytool -list -v -keystore /usr/java/jdk1.8.0_301-amd64/jre/lib/security/cacerts -storepass | grep "until:" | awk -F'until:' '{print }')

然后您可以使用日期命令将字符串日期转换为纪元:

epoch=$(date -d "$date" +"%s")

不确定

中的“天”是什么意思

... and convert that to epoch seconds and days

但要将其转换为纪元秒,您可以先删除所有内容,直到“until:”:

UNTIL=$(keytool ... | grep 'until:' | sed 's/^.*until: //')

然后使用date:

date -d "${UNTIL}" +%s

编辑

好的,对于密钥库中的多个条目,您可以修改以下代码段。在这里我们读取别名和“直到”日期,这样我们就可以确定我们在每次迭代中使用的证书。您可以修改它以读取其他字段。

KEYSTORE=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
KEYSTORE_PW=changeit
while read -r ALIAS; do
    # ALIAS is in the form: "Alias name: <REST>". We want <REST>.
    ALIAS=$(echo ${ALIAS} | cut -d' ' -f3)

    # read the next line
    read -r UNTIL

    # UNTIL is in the form: "Valid from: ... until: <REST>". We want <REST>
    UNTIL=$(echo ${UNTIL} | sed 's/^.*until: //')

    # convert to epoch
    EPOCH=$(date -d "${UNTIL}" +%s)

    # do something with it
    echo "${ALIAS}  -->  ${EPOCH}"
done < <(keytool -list -v -keystore "${KEYSTORE}" -storepass "${KEYSTORE_PW}" | grep -E '^Alias name:|^Valid from:')

输出为:

debian:ac_raiz_fnmt-rcm.pem  -->  1893456000
debian:accvraiz1.pem  -->  1924940257
debian:actalis_authentication_root_ca.pem  -->  1916306522
debian:addtrust_external_root.pem  -->  1590835718