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

web

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

bash
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

bash
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 [email protected]:$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 后续处理

评论