利用 Github Action 来对免费的 Let’s Encrypt 证书进行自动续签。
注:签发工具使用 acme.sh,签发模式为 DNS API;域名的 DNS provider 为 Cloudflare。
新建仓库 auto-acme。(仓库名称随意,最好是私人仓库。)
顺便一提:
2020年10月1日起, 新创建的存储库将默认为 main
。
添加 action 脚本中所需要的 Secrets 信息。
包括 DNS API 所需要的验证信息,以及如果需要发送附件邮件的话,还需要一套拥有 smtp 功能的电子邮箱和密码。
![第一次添加 Secrets](https://raw.githubusercontent.com/iMaple/imaple.github.io/assets/img/d55d5338610b0cbfebad040ae9e65001-fec5bd.webp)
![添加所需要的 Secrets](https://raw.githubusercontent.com/iMaple/imaple.github.io/assets/img/7dcfcb4b0051841ee08f86e73121ab8b-004e2b.webp)
创建 Github Action。
![第一次创建 Github Action](https://raw.githubusercontent.com/iMaple/imaple.github.io/assets/img/64986c41923538ff5db2c5ff64bd7b27-8d5f25.webp)
然后将下面的配置文件复制到网页上的编辑器内。
配置文件内容:
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: CI
on:
schedule:
- cron: "0 2 1 * *"
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Install acme.sh
run: |
curl https://get.acme.sh | sh
- name: Issue Certificates
env:
ACME: /home/runner/.acme.sh/acme.sh
CF_Account_ID: ${{ secrets.CF_ACCOUNT_ID }}
CF_Token: ${{ secrets.CF_TOKEN }}
run: |
mkdir -p ./ssl/example.com
$ACME --issue --dns dns_cf -d example.com -d '*.example.com' -k ec-256
$ACME --installcert --ecc -d example.com -d '*.example.com' --ca-file ./ssl/example.com/chain.pem --cert-file ./ssl/example.com/cert.pem --key-file ./ssl/example.com/key.pem --fullchain-file ./ssl/example.com/fullchain.pem
zip -r ssl.zip ssl
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ steps.date.outputs.date }}
release_name: ${{ steps.date.outputs.date }}
body: |
Renew certificate files at ${{ steps.date.outputs.date }}
draft: false
prerelease: false
- name: Upload Release Asset
id: upload_release_asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./ssl.zip
asset_name: ssl.zip
asset_content_type: application/zip
- name: Send Email
uses: dawidd6/[email protected]
with:
server_address: smtp.exmail.qq.com
server_port: 465
username: ${{ secrets.MAIL_USERNAME }}
password: ${{ secrets.MAIL_PASSWORD }}
subject: Auto ACME
body: Renew certificate files is complete! Download on ${{ steps.upload_release_asset.outputs.browser_download_url }}.
to: [email protected]
from: GitHub Workflow
attachments: ./ssl.zip
|
简单说下配置内容,有关 Github Action 详细信息,可查阅官方文档。首先:
1
2
3
4
5
6
| on:
schedule:
- cron: "0 2 1 * *"
push:
branches:
- main
|
此部分配置该 Action 什么时候运行。这里配置了两个触发器,包括一个 schedule,意为在每月 1 号的 UTC 时间 02:00 运行 Action;还有一个 push,意为当对 main
分支执行 push 操作时运行 Action。然后:
1
2
3
4
5
| jobs:
build:
runs-on: ubuntu-latest
steps:
# other...
|
此部分说明该 workflow 包含了一个 叫做 build 的 job,该 job 将在 ubuntu 的最新发型版上工作,并包含了如下的步骤:
- 安装 acme.sh。
- 使用 acme.sh 签发证书。此部分将 Secrets 中的
CF_ACCOUNT_ID
与 CF_TOKEN
加载到环境变量中,供 acme.sh 使用。(ps. 这里签发的是 ECC 证书) - 获取现在的日期,给后面 Release body 用。
- 创建一个 Release。
- 给上面创建的 Release 上传文件,也就是打包好的证书文件。
- 给指定邮箱发送一封包含附件的电子邮件。(不需要的话,这部分可以直接删掉)
接着,填写 Action 文件的文件名,点击 Start commit,输入 commit message 与 user email (可选),点击 Commit new file。
![最后的操作](https://raw.githubusercontent.com/iMaple/imaple.github.io/assets/img/e2ebc9027da974b022f3b2a3c758b60c-a47355.webp)
不出意外的话,应该会看到类似的界面:
![](https://raw.githubusercontent.com/iMaple/imaple.github.io/assets/img/986226f5af641f0b69a094a4d3b9ed10-d338ab.webp)
当 workflow 执行成功时(绿色对勾),到项目的 Release 页应该会看到
![](https://raw.githubusercontent.com/iMaple/imaple.github.io/assets/img/42e8a1bbdc9b6a916ae808aabbf1c069-cb8a11.webp)
以上。
ps. 私有仓库的 Github Action 每月有 2000 分钟免费计划,点击查看你的剩余额度。鉴于每月只构建一次,每次也就使用 1~2 分钟,所以完全够用。