私有仓库GitHub actions运行acme.sh 并加密推送到公开仓库

考虑到使用方便,把证书加密后 发送到公开仓库。部署的时候,只需要定时从公开仓库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 后续处理

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计