通过 GitHub Actions + acme.sh 免费全自动申请/续签泛域名 SSL 证书 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
danbao
V2EX    分享创造

通过 GitHub Actions + acme.sh 免费全自动申请/续签泛域名 SSL 证书

  •  
  •   danbao 2024-07-12 08:20:30 +08:00 4623 次点击
    这是一个创建于 455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    repo 在此

    https://github.com/danbao/auto-ssl

    记得不要直接 fork 这个 repo , 用 clone 然后 push 到你自己的 private github repo

    Features

    • 自动申请 SSL 证书,并通过 git commit 的方式保存证书到 SSL
    • 每天检查 SSL 证书是否快过期,如果小于 30 天,自动续期
    • 每天的检查报告会同步到 CHECK_LIST.md 文件中
    • 证书是泛域名证书
    • 同时申请 ECDSA 和 RSA 证书
    34 条回复    2024-07-18 15:46:37 +08:00
    totoro625
        1
    totoro625  
       2024-07-12 08:27:26 +08:00
    大概好几年前有类似的项目,配置好后正常跑了一两年,然后 actions 就会 Skipped
    网友告诉我是我这个项目太久没有修改过代码,导致 actions Skipped
    totoro625
        2
    totoro625  
       2024-07-12 08:28:23 +08:00
    目前用的方案是 GCP 免费服务器,每月 200G 流量足够拉取证书等需要可靠运行的服务了
    w292614191
        3
    w292614191  
       2024-07-12 08:36:23 +08:00
    感谢分享。

    现在阿里云只有 90 天免费了,大家都怎么解决的。
    linyongxin
        4
    linyongxin  
       2024-07-12 08:40:11 +08:00
    宝塔自带的经常出错,后来就直接全部接入 CloudFlare ,一劳永逸
    bilulanlv
        5
    bilulanlv  
       2024-07-12 09:02:26 +08:00
    @linyongxin
    我看介绍,他似乎只是源服务器和 Cloudflare 的认证,其他厂家认这种证书吗?

    源证书生成由 Cloudflare 签名的免费 TLS 证书,以安装在源服务器上。

    源证书仅对 Cloudflare 与源服务器之间的加密有效。
    danbao
        6
    danbao  
    OP
       2024-07-12 09:20:33 +08:00
    @totoro625
    我这个 repo 应该会避免这个问题,因为每天都会检查 SSL,检查完后会更新时间戳并提交 commit
    danbao
        7
    danbao  
    OP
       2024-07-12 09:21:03 +08:00
    @w292614191 这个 repo 就是用来解决这个问题的
    keyfunc
        8
    keyfunc  
       2024-07-12 09:23:07 +08:00
    不是,私钥就这么公开了?
    knva
        9
    knva  
       2024-07-12 09:27:56 +08:00
    私钥已撸
    danbao
        10
    danbao  
    OP
       2024-07-12 09:33:36 +08:00
    @keyfunc @knva 哈哈,私钥在提交的时候已打码了~不过这个域名本来就是学费米,无所谓
    logictan89
        11
    logictan89  
       2024-07-12 09:59:55 +08:00
    @linyongxin 宝塔垃圾,试试 1panel 。我就是因为宝塔经常续签 ssl 证书出错才换的。
    highFreqSurfer
        12
    highFreqSurfer  
       2024-07-12 10:15:43 +08:00
    @w292614191 用 certbot, 定时任务跑
    stormwindcity
        13
    stormwindcity  
       2024-07-12 10:33:19 +08:00
    感谢分享
    Jinnrry
        14
    Jinnrry  
       2024-07-12 11:15:15 +08:00 via Android
    道理我都懂,可是 commit 以后私钥不就泄漏了?要是把私钥打码了,那你自己怎么用啊?

    要么别用 commit ,提交到自己网盘,要么你 aes 加密一下再 commit 呀
    danbao
        15
    danbao  
    OP
       2024-07-12 11:27:47 +08:00
    @Jinnrry 注意看这句话
    记得不要直接 fork 这个 repo , 用 clone 然后 push 到你自己的 private github repo
    br_wang
        16
    br_wang  
       2024-07-12 12:08:38 +08:00
    @Jinnrry 也可以放到项目的 Actions secrets 里,就是泄露给 github 了。
    acme.sh 不是有自动更新的 cronjob 么?
    wdssmq
        17
    wdssmq  
       2024-07-12 12:11:05 +08:00
    wdssmq/php-nginx-dc: 用于部署多站点 PHP + Nginx 环境的 Docker Compose 配置,使用 webdevops/php-nginx ;
    https://github.com/wdssmq/php-nginx-dc

    我现在换了 All In Docker 。。acme 也跑在容器里。。/doge
    danbao
        18
    danbao  
    OP
       2024-07-12 12:44:03 +08:00
    @br_wang 我的使用场景是内网有 ssl 的需求,比如 esxi ,adguard 的 DoH,但又不想专门搞个 vps 跑 cronjob
    lblblong
        19
    lblblong  
       2024-07-12 14:44:07 +08:00
    有没有腾讯云版的
    Donaldo
        20
    Donaldo  
       2024-07-12 14:44:38 +08:00
    @totoro625 #1 隔一段时间 commit 一次就行,可以设置个机器人干这个?
    molezznet
        21
    molezznet  
       2024-07-12 15:40:39 +08:00 via Android
    看起来方便的。暂时在用免费的微林
    lblblong
        22
    lblblong  
       2024-07-12 15:49:00 +08:00
    @lblblong 改了下代码已经可以了
    lxqxqxq
        23
    lxqxqxq  
       2024-07-12 16:37:44 +08:00
    @w292614191 #3 哈哈哈 定时任务 /85 天执行一次
    danbao
        24
    danbao  
    OP
       2024-07-12 16:49:01 +08:00
    @lblblong 参考 acme.sh 的文档改一下密钥就行了

    ```yaml
    name: DnsPod SSL Certificates

    on:
    schedule: # execute every 24 hours
    - cron: "35 7 * * *"
    workflow_dispatch:

    env:
    ACME: /home/runner/.acme.sh/acme.sh
    DP_ID: ${{ secrets.DP_ID }}
    DP_KEY: ${{ secrets.DP_KEY }}
    EMAIL: ${{ secrets.EMAIL }}

    jobs:
    build:
    runs-on: ubuntu-latest
    if: github.event_name == 'schedule' || github.event.repository.owner.id == github.event.sender.id
    steps:
    - name: Checkout
    uses: actions/checkout@v4
    - name: Install & Configure acme.sh
    run: |
    curl https://get.acme.sh | sh -s email=$EMAIL
    - name: Issue & Deploy Certificates
    run: |
    export DP_Id=$DP_ID
    export DP_Key=$DP_KEY

    git config --global user.email $EMAIL
    git config --global user.name acme

    # 如果想要其他证书发行机构,可以把 acme.sh 的 ca 目录拷贝到 repo 的 ca 目录
    # mkdir -p /home/runner/.acme.sh/ca/
    # cp -r ca/* /home/runner/.acme.sh/ca/

    check_certificate_validity() {
    cert_path=$1
    if [ -f "$cert_path" ]; then
    if openssl x509 -checkend $(( 30 * 86400 )) -noout -in "$cert_path"; then
    echo "Certificate at $cert_path is valid for more than 30 days, skipping..."
    return 0
    else
    return 1
    fi
    else
    return 1
    fi
    }

    issue_and_install_certificate() {
    domain=$1
    cert_type=$2 # "EC" or "RSA"
    acme_server=$3 # default choose "letsencrypt" 其他 CA 请参考 https://github.com/acmesh-official/acme.sh/wiki/CA
    keylength=$4 # empty for EC, "3072" for RSA

    cert_path="./ssl/$domain"
    [ "$cert_type" = "RSA" ] && cert_path="$cert_path/rsa"
    cert_file="$cert_path/$domain.cer"
    key_file="$cert_path/$domain.key"

    # Issue certificate
    issue_status=0
    $ACME --issue --server $acme_server --debug --dns dns_dp -d "$domain" -d "*.$domain" ${keylength:+--keylength $keylength} || issue_status=$?
    if [ $issue_status -ne 0 ]; then
    echo "Failed to issue $cert_type certificate for $domain, skipping..."
    return
    fi

    # Install certificate
    install_status=0
    $ACME --installcert -d "$domain" --key-file "$key_file" --fullchain-file "$cert_file" || install_status=$?
    if [ $install_status -ne 0 ]; then
    echo "Failed to install $cert_type certificate for $domain, skipping..."
    return
    fi

    TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
    git add $cert_path/
    git commit -m "Update $cert_type certificate files for $domain at $TIMESTAMP"
    }

    while IFS= read -r domain || [ -n "$domain" ]; do
    mkdir -p "./ssl/$domain/rsa"

    # Check and issue/install EC certificate
    if ! check_certificate_validity "./ssl/$domain/$domain.cer"; then
    issue_and_install_certificate "$domain" "EC" "letsencrypt" ""
    fi

    # Check and issue/install RSA certificate
    if ! check_certificate_validity "./ssl/$domain/rsa/$domain.cer"; then
    issue_and_install_certificate "$domain" "RSA" "letsencrypt" "3072"
    fi

    done < dnspod_domains_list.txt
    - name: Push changes
    uses: ad-m/github-push-action@master
    with:
    github_token: ${{ secrets.GITHUB_TOKEN }}
    ```
    gaojiren
        25
    gaojiren  
       2024-07-12 16:51:46 +08:00
    我用 AlphaSSL ,泛域名 1 年 30 块钱,花小钱办大事
    Actrace
        26
    Actrace  
       2024-07-13 14:06:49 +08:00
    vx 有免费的自动续签的 SSL 服务,只需要配置 DNS 就完成配置下证书。
    应该是目前最简单的。
    wushenlun
        27
    wushenlun  
       2024-07-13 14:11:03 +08:00
    @totoro625 GCP 有免费服务器吗,细说以下?
    blankmiss
        28
    blankmiss  
       2024-07-13 16:06:34 +08:00
    @gaojiren AlphaSSL 的 30 块钱证书 不已经被回收了? 萌咖那种 ?
    jeffma
        29
    jeffma  
       2024-07-13 17:44:29 +08:00   1
    自荐下自己的方案,已经稳定运行两年多了

    借助腾讯云云函数实现的 ACME Let’s Encrypt SSL 证书自动更新

    https://github.com/Jeff2Ma/acme-qcloud-scf
    jeffma
        30
    jeffma  
       2024-07-13 17:45:05 +08:00
    @lblblong 自荐下自己的方案,已经稳定运行两年多了

    借助腾讯云云函数实现的 ACME Let’s Encrypt SSL 证书自动更新

    https://github.com/Jeff2Ma/acme-qcloud-scf
    ilylx2008
        31
    ilylx2008  
       2024-07-13 21:30:01 +08:00
    有自动更新阿里云腾讯云 cdn 的证书么
    GoRoad
        32
    GoRoad  
       2024-07-15 09:43:20 +08:00
    @danbao #18 那老哥是给内网地址解析的域名吗,我现在也是这个问题,直接把域名解析到内网的私有网段了,证书就很苦恼
    danbao
        33
    danbao  
    OP
       2024-07-15 10:26:33 +08:00
    @GoRoad 按 github action 的方式获取证书还苦恼啥
    lblblong
        34
    lblblong  
       2024-07-18 15:46:37 +08:00
    @jeffma 老哥
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     931 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 22:01 PVG 06:01 LAX 15:01 JFK 18:01
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86