利用 GitHub Action 自动续签 SSL 证书

利用 GitHub Action 自动续签 SSL 证书

利用 Github Action 来对免费的 Let’s Encrypt 证书进行自动续签。

注:签发工具使用 acme.sh,签发模式为 DNS API;域名的 DNS provider 为 Cloudflare。

新建仓库 auto-acme。(仓库名称随意,最好是私人仓库。)

顺便一提:

2020年10月1日起, 新创建的存储库将默认为 main1

添加 action 脚本中所需要的 Secrets 信息。

包括 DNS API 所需要的验证信息,以及如果需要发送附件邮件的话,还需要一套拥有 smtp 功能的电子邮箱和密码。

第一次添加 Secrets

添加所需要的 Secrets

创建 Github Action。

第一次创建 Github Action

然后将下面的配置文件复制到网页上的编辑器内。

配置文件内容:

 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 的最新发型版上工作,并包含了如下的步骤:

  1. 安装 acme.sh。
  2. 使用 acme.sh 签发证书。此部分将 Secrets 中的 CF_ACCOUNT_IDCF_TOKEN 加载到环境变量中,供 acme.sh 使用。(ps. 这里签发的是 ECC 证书)
  3. 获取现在的日期,给后面 Release body 用。
  4. 创建一个 Release。
  5. 给上面创建的 Release 上传文件,也就是打包好的证书文件。
  6. 给指定邮箱发送一封包含附件的电子邮件。(不需要的话,这部分可以直接删掉)

接着,填写 Action 文件的文件名,点击 Start commit,输入 commit message 与 user email (可选),点击 Commit new file。

最后的操作

不出意外的话,应该会看到类似的界面:

当 workflow 执行成功时(绿色对勾),到项目的 Release 页应该会看到

以上。

ps. 私有仓库的 Github Action 每月有 2000 分钟免费计划,点击查看你的剩余额度。鉴于每月只构建一次,每次也就使用 1~2 分钟,所以完全够用。

利用 GitHub Action 自动续签 SSL 证书

https://blog.imaple.net/posts/auto_acme/

作者

iMaple

发布于

2020-06-06

更新于

2020-07-28

许可协议

CC BY-NC 4.0

评论