最近服务器到期,重新更换了一台服务器,发现每次迁移工作量还是蛮大。于是想到,能否用 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 备用

-
配置权限
点击添加权限,授予新用户以下权限:
AliyunRAMFullAccess
-
配置 key 和 secret
对应配置文件全局环境变量里边 env.Ali_Key 和 env.Ali_Secret, 这里可以使用 Github Actions secrets and variables 配置,更加安全
其他自定义环境变量说明
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 服务器
再将 Nginx 的 SSL 证书配置到上述地址,即可使用
具体 Nginx 的配置可结合上一篇文章