在做 https 的时候,使用了 letsencrypt 的证书,letsencrypt 的证书 90 天更新一次,正常情况下,只有一个域名就很方便处理,写一个 crontab 就搞定了。
letsencrypt 出了泛域名后,泛域名只支持 1 级的匹配。当有多个子域名使用的时候,管理起来就很难受。
所幸的是,acme.sh 支持 deploy_hook 来自行调用一个 shell 脚本。所以用不到10行的代码,做了一个利用 git 来管理域名证书。
- 首先在acme.sh里面配置一个 git 的地址。
- 申请泛域名时同时申请泛域名的主域名
- hook 提交按照域名提交到不同的分支
- 线上对应的域名只需要配置一个 crontab 来定时拉 git ,重启服务。
思路虽然简单粗暴,这样做的好处是可以很清楚的在git上面看到证书的更新,同时更新也可以利用 gitlab 的 hook 通知到 钉钉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| git_deploy() { _cdomain="$1" _ckey="$2" _ccert="$3" _cca="$4" _cfullchain="$5"
_debug _cdomain "$_cdomain" _debug _ckey "$_ckey" _debug _ccert "$_ccert" _debug _cca "$_cca" _debug _cfullchain "$_cfullchain"
GIT_REMOTE="${GIT_REMOTE:-$(_readaccountconf_mutable GIT_REMOTE)}"
if [ -z $GIT_REMOTE ];then _err "Git remote is enpty! please add GIT_REMOTE to the account.conf file" fi
cd $DOMAIN_PATH # 判断是否有git源 if [ ! -f ".git" ];then git init git remote add origin $GIT_REMOTE git add --all fi
export GIT_DIR=$DOMAIN_PATH/.git DATE=$(date +%Y%m%d) # echo "$DATE $_cdomain update time" >>$DOMAIN_PATH/update_data.txt git add --all git commit -m "update $DATE" git push --force origin master:$_cdomain unset GIT_DIR
# _err "Not implemented yet"
return 1
}
|