Featured image of post Github Action 自动化更新阿里SSL证书

Github Action 自动化更新阿里SSL证书

Github Action 自动化部署、更新SSL证书并推送到目标服务器

最近服务器到期,重新更换了一台服务器,发现每次迁移工作量还是蛮大。于是想到,能否用 Github Action 来自动更新 SSL 证书,并推送到对应目标服务器,这样子以后更换服务器就少点工作了。于是搜索了一圈,发现使用 acme 自动更新 SSL 的文章还是蛮多的,但是更新阿里云 DNS 证书的就比较少了,英文站点已经有 Github Page,国内站点使用阿里云体验感比较好,才有了这篇文章。

请保证该项目私有!!!

安全套接层SSL(Secure Sockets Layer)协议是在Internet基础上提供的一种保证私密性的安全协议。SSL通过握手在客户端和服务器之间建立会话,完成通信双方身份的验证、密钥和加密套件的协商,从而确保客户端与服务器之间的通信不被窃听,保证网络上数据传输的安全性。SSL 使用证书对通信双方之间建立连接的两端进行认证,从而确保安全。

英文站点 - Github Page 访问地址:

zoyao.github.io

中文站点 - Nginx 私有化部署访问地址:

zoyao.site

安装配置

整体使用还是蛮简单的,一个 workflows 文件搞定

 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 名称
name: Issue SSL Certificates
# 触发条件
on:
  # 手动运行
  workflow_dispatch:
  # 定时运行
  schedule:
    # 每月运行一次
    - cron: '0 0 1 */1 *'

# 全局环境变量
env:
  # Checkout 到的目录
  CERTS_OUTPUT_BASE: certs
  # 域名
  DOMAIN_NAME: zoyao.site
  # 证书文件名
  FILE_FULLCHAIN: cert.pem
  # 私钥文件名
  FILE_KEY: key.pem
  # 使用的 git 分支
  SSL_BRANCHE: master
  # Ali_dns
  Ali_Key: Ali_Key
  Ali_Secret: Ali_Secret
 
jobs:
  issue-ssl-certificate:
    name: Issue SSL certificate
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          ref: ${{ env.SSL_BRANCHE }}
          path: ${{ env.CERTS_OUTPUT_BASE }}
 
      # 安装 acme.sh
      - name: Install acme.sh
        shell: bash
        run: curl https://get.acme.sh | sh -s email=xxxx@gmail.com
 
      # 申请证书
      - name: Issue SSL certificates
        shell: bash
        run: |
          export Ali_Key="${{ env.Ali_Key }}"
          export Ali_Secret="${{ env.Ali_Secret }}"
          ~/.acme.sh/acme.sh --issue        \
            --dns dns_ali \
            -d "${{ env.DOMAIN_NAME }}" \
            -d "*.${{ env.DOMAIN_NAME }}" \
            --dnssleep 300 --debug --force --server letsencrypt
 
      # 导出证书
      - name: Copy certificate to output paths
        shell: bash
        run: |
          ACME_SH_TEMP_DIR="$(mktemp -d)"
          ACME_SH_TEMP_FILE_FULLCHAIN="$ACME_SH_TEMP_DIR/fullchain.pem"
          ACME_SH_TEMP_FILE_KEY="$ACME_SH_TEMP_DIR/key.pem"
 
          ~/.acme.sh/acme.sh --install-cert -d "$ACME_SH_FIRST_DOMAIN" --fullchain-file "$ACME_SH_TEMP_FILE_FULLCHAIN" --key-file "$ACME_SH_TEMP_FILE_KEY"
 
          [[ -z "$ACME_SH_OUTPUT_FULLCHAIN" ]] || (mkdir -p "$(dirname "$ACME_SH_OUTPUT_FULLCHAIN")" && cp "$ACME_SH_TEMP_FILE_FULLCHAIN" "$ACME_SH_OUTPUT_FULLCHAIN")
          [[ -z "$ACME_SH_OUTPUT_KEY" ]] || (mkdir -p "$(dirname "$ACME_SH_OUTPUT_KEY")" && cp "$ACME_SH_TEMP_FILE_KEY" "$ACME_SH_OUTPUT_KEY")
 
          rm -rf "$ACME_SH_TEMP_DIR"
        env:
          # 修改此处的 example.com 为申请时填写的第一个域名
          ACME_SH_FIRST_DOMAIN: ${{ env.DOMAIN_NAME }}
          ACME_SH_OUTPUT_FULLCHAIN: ${{ env.CERTS_OUTPUT_BASE }}/${{ env.DOMAIN_NAME }}/${{ env.FILE_FULLCHAIN }}
          ACME_SH_OUTPUT_KEY: ${{ env.CERTS_OUTPUT_BASE }}/${{ env.DOMAIN_NAME }}/${{ env.FILE_KEY }}

      - name: Deploy Web
        uses: peaceiris/actions-gh-pages@v3
        with:
          PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
          EXTERNAL_REPOSITORY: zoyao/acme-ssl
          PUBLISH_BRANCH: ${{ env.SSL_BRANCHE }}
          PUBLISH_DIR: ./${{ env.CERTS_OUTPUT_BASE }}
          commit_message: "ssl update"

      - name: Deploy Web Self
        uses: easingthemes/ssh-deploy@main
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
          REMOTE_HOST: ${{ secrets.ip }}
          REMOTE_USER: ${{ secrets.user }}
          SOURCE: ./${{ env.CERTS_OUTPUT_BASE }}/
          TARGET: ${{ secrets.target }}
          ARGS: -avz --delete --chown=git:git

申请阿里云 API

  • 创建 acme 访问用户

    登录阿里云后台后,进入 权限与安全 / 权限与安全, 选择 身份管理 / 用户,创建新用户,勾选 使用永久 AccessKey 访问,确认后保存对应的 key 以及 secret 备用

    alt text

  • 配置权限

    点击添加权限,授予新用户以下权限:

    AliyunRAMFullAccess

  • 配置 key 和 secret

    对应配置文件全局环境变量里边 env.Ali_Key 和 env.Ali_Secret, 这里可以使用 Github Actions secrets and variables 配置,更加安全

其他自定义环境变量说明

  • Github 下证书上传的目录,不建议修改(因 Github 会限制没有 Commit 的仓库使用 Action,因此这里每次获取到证书都会上传到自己的目录下保活,所以,本项目必须、必须、必须保证私有!!!)

    env.CERTS_OUTPUT_BASE

  • 域名,对应 SSL 的域名,请修改成自己的域名

    env.DOMAIN_NAME

  • 证书文件名,可更改,根据 Nginx 中配置

    env.FILE_FULLCHAIN

  • 私钥文件名,可更改,根据 Nginx 中配置

    env.FILE_KEY

  • 证书上传至 Github 分支,请确保分支已创建好

    env.SSL_BRANCHE

Action 节点说明

Install acme.sh

安装 acme,email 后请配置自己的 email 地址

Issue SSL certificates

申请 SSL 证书,此处指定 –server letsencrypt,使用 letsencrypt 来验证生成的证书是否生效

Copy certificate to output paths

将证书导出

Deploy Web

将证书上传至 Github

Deploy Web Self

将证书上传到自己的 Web 服务器

  • SSH_PRIVATE_KEY 自己服务器的 SSH Key

  • REMOTE_HOST 服务器IP

  • REMOTE_USER 用户名

  • TARGET 上传到自己服务的指定目录

再将 Nginx 的 SSL 证书配置到上述地址,即可使用

具体 Nginx 的配置可结合上一篇文章