尝试创建一个使用 LetsEncrypt 自动续订 SSL 的脚本。
每日脚本首先检查 SSL 到期时间:
response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"
$response
是notAfter=May 9 19:27:44 2018 GMT
我想将它与今天的日期进行比较,并检查时差是否小于或等于 7 天。伪代码:
if [$response is less than 7 days away from today] then cd ~/letsencrypt $$ ~/dehydrated/dehydrated --cron --domain www.mydomain.com --out . --challenge http-01
我该怎么做呢?
我尝试$response
通过转换为更可行的格式,date -d
但出现date: extra operand ‘19:27:44’
错误。
答案1
我将解决您实际关心的问题,而不是您提出的具体问题:dehydrated --cron
已经为您检查了日期。
文档:
--cron
(-c
) 签署/续订不存在/更改/过期的证书。
代码:
# Check expire date of existing certificate
if [[ -e "${cert}" ]]; then
echo " + Checking expire date of existing cert..."
valid="$("${OPENSSL}" x509 -enddate -noout -in "${cert}" | cut -d= -f2- )"
printf " + Valid till %s " "${valid}"
if "${OPENSSL}" x509 -checkend $((RENEW_DAYS * 86400)) -noout -in "${cert}"; then
printf "(Longer than %d days). " "${RENEW_DAYS}"
if [[ "${force_renew}" = "yes" ]]; then
echo "Ignoring because renew was forced!"
else
# Certificate-Names unchanged and cert is still valid
echo "Skipping renew!"
(https://github.com/lukas2511/de一线/blob/master/de一线#L1234-L1253)
RENEW_DAYS
似乎默认为 30,但您可以使用配置文件覆盖它;引用文档:
deHydrated 正在几个不同的地方寻找配置文件,它将使用按以下顺序找到的第一个配置文件:
/etc/dehydrated/config
/usr/local/etc/dehydrated/config
- shell 的当前工作目录
- 运行脱水的目录
那里的示例配置文件包含这一行:
# Minimum days before expiration to automatically renew certificate (default: 30)
#RENEW_DAYS="30"
例如,要将值从默认的 30 天降低到 7 天,您可以将第二行编辑为:
RENEW_DAYS="7"
答案2
现在确定到期日期为 1970 年 1 月 1 日的秒数,并将差值除以一天的秒数。
$ TZ=GMT date -d "May 9 19:27:44 2018 GMT" '+%s'
1525894064
$ TZ=GMT date '+%s'
1518192447
$ expr \( 1525894064 - 1518192447 \) / 86400
89
答案3
下面的命令将检查 openssl 命令提供的日期与“7 天后”的日期;如果 openssl 日期(自纪元以来的秒数)距离现在不到 7 天(自纪元以来的秒数),该if
命令将成功,您可以执行您需要执行的操作:
response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"
responsetime=${response##notAfter=}
responsetz={$responsetime##* }
if [ $(date -d "$responsetime" +%s) -lt $(TZ=$responsetz date -d "now + 7 days" +%s) ]
then
## do the needful
fi
第一个赋值(在获得 $response 之后)去掉了前导的“notAfter=”文本。第二个任务捕获响应的时区;如果始终是格林威治标准时间,这可以简化。
这两个日期命令询问 (GNU) date 自 openssl 日期和“现在 + 7 天”的纪元以来的时间(以秒为单位),请小心地将第二次调用的时区设置为 openssl 命令报告的时区。