You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本优化:避免证书到期前重复生成CSR请求

证书到期自动处理脚本优化

问题背景

我有一个Bash脚本,用来检查.cer证书是否会在14天内到期,若是则归档旧证书请求、生成新CSR(证书签名请求)并发送给中间件团队。但脚本通过cron每日凌晨运行,存在证书到期前每日重复发送请求的问题。

我的需求是:通过检查.csr文件的修改时间,若其在证书到期前14天内已修改则不执行操作;否则执行归档CSR、生成新CSR、发送CSR的操作。

初始核心逻辑

最初的脚本核心依赖Python判断证书到期时间:

if python -c "
import datetime
import sys
current_time = datetime.datetime.now()
key_time = datetime.datetime.strptime(sys.argv[1], '%b %d %Y')
difference = key_time - current_time
sys.exit(0 if difference.days < 14 else 1)
" "$( keytool -printcert -file "$1" | sed '4q;d' | awk '{print $11,$12,$15}' )";then archive;gencert;mail;else echo "Cert is still current";fi

环境信息

运行环境:Oracle Linux Server release 7.9

初始优化思路

我计划将.cer证书的到期时间和.csr文件的修改时间都转换为epoch时间,通过对比时间戳实现逻辑:如果.csr的时间戳晚于(证书到期时间-14天),则不操作;否则执行归档、生成、发送操作。

写出的雏形代码如下:

domain=`echo "$1" | sed 's/\.cer//'`
csr_time_stamp=$(<epoch time of modified date>)
cer_exp_date=$(<epoch time of .cer exp. date>)
if [ $csr_time_stamp > $cer_time_stamp ] && [ -f flagfiles/$domain.csr ];then echo $csr_time_stamp >> flagfiles/$domain.csr;else archivecsr; gencsr; mailcsr;fi

但不确定是否需要检查标记文件的时间戳,或者直接将两个日期存入变量即可省略标记文件步骤。

相关命令输出示例

  • keytool获取证书到期时间:
keytool -printcert -file fqdn.domainname.com.cer | sed '4q;d' | awk '{print $11,$12,$15}'
Jan 24 2018
  • stat获取CSR文件修改时间:
stat fqdn.domainname.com.csr | grep Modify | awk '{print $2}'
2023-03-13

最终实现脚本

在@markp-fuso的帮助下,我完成了可行的脚本:

domain=`echo "$1" | sed 's/\.cer//'`
OUTPUT_DIR=<obfuscated>
archive=<obfuscated>

# 将keytool输出的到期日期转换为epoch时间
keytool_dt=$(keytool -printcert -file "$1" | sed '4q;d' | awk '{print $11,$12,$15}') # 示例输出: 'Jan 24 2018'
exp_dt=$(date -d "${keytool_dt}" "+%s")      # 转换为epoch秒数

# 计算14天对应的秒数
dt_range=$((14 * 60 * 60 * 24))              # 结果为1209600

# 获取当前时间的epoch秒数(两种方式可选)
now_dt=$(date "+%s")                         # 会启动子进程
# printf -v now_dt '%(%s)T'                   # 不启动子进程,需要bash 3.1+版本

# 获取CSR文件最后修改时间的epoch秒数
mod_dt=$(stat -c "%Y" "$domain".csr)

echo "domain.csr: $domain.csr"
echo "now_dt: $now_dt exp_dt: $exp_dt dt_range: $dt_range exp_dt: $exp_dt mod_dt: $mod_dt"

if (( $now_dt > ($exp_dt + $dt_range) ))     # 证书已过期或即将过期
then
   if (( ($now_dt - $mod_dt) > $dt_range ))  # CSR文件最后修改时间超过14天
   then
       echo "cert expired: generate new csr"
       # 此处添加实际执行的归档、生成CSR、发送邮件的命令
       # archivecsr; gencsr; mailcsr
   else
       echo "cert expired: new csr pending"
   fi
else
   echo "cert is valid"
fi

运行输出示例

now_dt: 1678893896
domain.csr: <obfuscated>.csr
now_dt: 1678893896 exp_dt: 1516780800 dt_range: 1209600 exp_dt: 1516780800 mod_dt: 1678767236
cert expired: new csr pending

内容的提问来源于stack exchange,提问作者puppet_master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:27:55