用 git 来 对letsencrypt 证书管理

在做 https 的时候,使用了 letsencrypt 的证书,letsencrypt 的证书 90 天更新一次,正常情况下,只有一个域名就很方便处理,写一个 crontab 就搞定了。

letsencrypt 出了泛域名后,泛域名只支持 1 级的匹配。当有多个子域名使用的时候,管理起来就很难受。

所幸的是,acme.sh 支持 deploy_hook 来自行调用一个 shell 脚本。所以用不到10行的代码,做了一个利用 git 来管理域名证书。

  1. 首先在acme.sh里面配置一个 git 的地址。
  2. 申请泛域名时同时申请泛域名的主域名
  3. hook 提交按照域名提交到不同的分支
  4. 线上对应的域名只需要配置一个 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

}

用 git 来 对letsencrypt 证书管理

https://beixiu.net/dev/letsencrypt证书同步管理/

作者

张巍

发布于

2018-12-14

更新于

2018-12-14

许可协议

评论