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
相关产品推荐
相关产品推荐

