考虑到使用方便,把证书加密后 发送到公开仓库。部署的时候,只需要定时从公开仓库wget下来即可使用。
后续会考虑自动推送到cdn,因为cdn那边是生产环境,暂时还是不用免费证书。
github自动申请 域名证书,加密推送到公开库以及自动部署等
自动申请
准备
1、两个github仓库 1个私有库 存放 自动脚本,另外一个公开仓库存放加密的证书压缩包 公开就好,可以开pages 或者套cdn 默认分支为main
2、申请域名证书的域名dns服务器的api,我这里都是用dnspods为例
3、一对ssh公私钥。公钥匙要配置到 公开仓库 的Deploy keys,私玥部署到 私有库的Secret
4、一个16位以上足够复杂的密码(zip包可以穷举,所以务必要高强度的密码)
5、少许linux基础知识
配置加密信息
配置公私玥
公开库的在仓库的 Settings 中Deploy keys添加 填写 ssh公钥,勾选上 Allow write access 名字随意
私钥部署到私有库的Secret 名称为 MYGITHUBKEY
dns api
在仓库的 Settings 中添加 Secret,创建 DNSAPI 填写上文获取的 API KEY 格式如下,具体格式 查看 acme.sh 的文档
1
2
3
4
| export DP_Id="214234234"
export DP_Key="XXXXXXXXXX"
export CF_Token="XXXXXXXXXXXXXX"
export CF_Account_ID="XXXXXXXXXXXX"
|
压缩包密码
再创建一个 ZIPPASSWORD 输入压缩包解压密码,一定必须要超级高强度的密码。比如 16位以上 包含数字字母特殊符号汉字
配置github actions
在私有仓库中创建 .github/workflows/AutoACME.yml
配置文件,参考复制粘贴如下.
cron 是 UTC时间 每月26日下午17点7分 自动执行
完整内容参考 :https://github.com/joyanhui/file.leiyanhui.com/blob/main/github-actions/%E8%87%AA%E5%8A%A8%E7%94%B3%E8%AF%B7%E8%AF%81%E4%B9%A6%E5%B9%B6%E6%8E%A8%E9%80%81%E5%88%B0%E5%85%AC%E5%BC%80%E4%BB%93%E5%BA%93.yml
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| name: Auto ACME
on:
workflow_dispatch:
schedule:
- cron: "7 17 20 * *"
watch:
types: [started]
env:
ACME: /home/runner/.acme.sh/acme.sh
PUBHUB: /你的用户名/仓库地址
DNSAPI: ${{ secrets.DNSAPI }}
ZIPPASSWORD: ${{ secrets.ZIPPASSWORD }}
MYGITHUBKEY: ${{ secrets.MYGITHUBKEY }}
EMAIL: 你的邮箱地址@qq.com
TZ: Asia/Shanghai
jobs:
build:
runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id
steps:
- name: Checkout
uses: actions/checkout@v2
with:
ref: main
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: 安装和初始化acme.sh
run: |
curl https://get.acme.sh | sh
echo "$DNSAPI" >> /home/runner/.acme.sh/account.conf
$ACME --register-account -m $EMAIL
- name: 开始获取证书
run: |
mkdir -p ./ssl
#如果要处理多个域名,复制后面三行即可 默认使用zerossl的证书 其他参数参考acme.sh文档
mydomian=你的域名.com
$ACME --issue --dns dns_dp -d ${mydomian} -d *.${mydomian}
$ACME --installcert -d ${mydomian} --key-file ./ssl/${mydomian}.key --fullchain-file ./ssl/${mydomian}.cer
- name: 带密码打包证书
run: |
zip -r acme.zip /home/runner/.acme.sh -P $ZIPPASSWORD
zip -r ssl.zip ssl -P $ZIPPASSWORD
- name: 提交加密后的证书到公开库
run: |
mkdir -p ~/.ssh/
echo "$MYGITHUBKEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
rm -rf .git* && rm -rf README.md
echo "处理公开库的readme文件"
wget https://raw.githubusercontent.com/$PUBHUB/main/README.md
echo -e "\n证书最后更新: $(date '+%Y-%m-%d %H:%M:%S')">>README.md
git init
git config --global user.name "githubactions bot"
git config --global user.email "$ACME"
git add ./ssl.zip ./README.md ./acme.zip
git commit -m "证书自动更新 on $(date '+%Y-%m-%d %H:%M:%S')"
git remote add origin git@github.com:$PUBHUB.git
git remote -v
git push origin master:main -f -q
|
客户端使用 wget 后 7z -P 密码 ,然后 nginx -s reload即可
自动更新 参考 :https://dev.leiyanhui.com/web/auto-updatessl-form-github
自动部署到国内cdn 后续处理