Recommended Services
› Amazon Web Services
› LeanCloud
› New Relic
› ClearDB
kincaid
V2EX  ›  云计算

SSL 证书再有几年 47 天了,大家有什么自动化方案嘛

  •  
  •   kincaid ·
    PRO
    · May 9, 2025 · 11450 views
    This topic created in 544 days ago, the information mentioned may be changed or developed.
    看到宝塔面板发的视频感觉有点不好玩啊 https://www.bilibili.com/video/BV1Ru5uzMEi9/

    之前用免费一年证书,现在买野鸡一年证书,就是不想折腾,以后真到 47 天想不折腾也不行了似乎
    看了几个自动化工具,看起来挺好,但是真的懒得动,那么多服务器能动就懒得折腾

    宝塔视频推的这个 https://allinssl.com ,好像功能有点少
    还有之前的 certd ,certimate ,还有传统的 acme.sh (可惜部署云服务有点难),外加 cerbot ,caddy 那一堆,好像几家大厂也有在插手

    好想摆烂,CA/B 这么玩干脆请求一次就签一张证书算了
    88 replies  •  2025-05-29 22:50:15 +08:00
    Guazi2
    Guazi2
    May 9, 2025❤️1
    1
    lucky or nginx proxy manager
    qbmiller
    qbmiller
    May 9, 2025
    2
    cloudfare 是不是免费代理? 我的域名阿里云买的,但解析地址迁移到 cf ,然后就能用了。也不用每几个月一刷新了
    kincaid
    kincaid
    OP
    PRO
    May 9, 2025
    3
    @qbmiller 小博客还是备案了
    2MO
    2MO
    May 9, 2025
    4
    51 我刚用 https://www.rainyun.com/shop_ 云应用的免费额度搭了个 https://github.com/mouday/domain-admin ,希望稳定
    asdqaz
    asdqaz
    May 9, 2025
    5
    请求一次签一次对他压力太大了。
    NewYear
    NewYear
    May 9, 2025
    6
    个人觉得这是好事。

    因为这会强制推动 SSL 证书完全自动化申请、续期。
    guo4224
    guo4224
    May 9, 2025 via iPhone
    7
    那么多 hook 点,写几个脚本的事
    love4taylor
    love4taylor
    May 9, 2025 via iPhone
    8
    说到这个,不知道 IP 证书会怎么样
    shannon404
    shannon404
    May 9, 2025
    9
    InDom
    InDom
    May 9, 2025
    10
    自己服务器直接用 acme.sh 定时任务续签.

    至于云服务, 比如 CDN 之类的, 前两天刚写了个脚本, 直接调用 acme.sh + qccli + python + 云平台 SDK 实现自动上传证书 + 应用证书.
    AhFei
    AhFei
    May 9, 2025
    11
    一直在用 acme.sh 自动更新证书 + Nginx 反代,没有特殊需求的情况下操作也挺简单的: https://yanh.tech/2024/08/applying-certificates-with-acme-sh/
    flyqie
    flyqie
    May 9, 2025 via Android
    12
    @NewYear #6

    步子迈的太大了吧?
    snylonue
    snylonue
    May 9, 2025
    13
    nixos 提供的 acme
    irrigate2554
    irrigate2554
    May 9, 2025❤️1
    14
    caddy
    lovelylain
    lovelylain
    May 9, 2025 via Android
    15
    acme.sh 更新证书后,ssh 上传到目标机
    ijyuqi
    ijyuqi
    May 9, 2025
    16
    免费 3 个月的证书,自动化续签,根本不用管
    pony2335
    pony2335
    May 9, 2025
    17
    acme.sh 脚本,很方便。 提前一个月就更新
    zhj9709
    zhj9709
    May 9, 2025
    18
    我一直用 nginx proxy manager
    TrembleBeforeMe
    TrembleBeforeMe
    May 9, 2025
    19
    certd 更新 cdn 域名证书
    hellolinuxer
    hellolinuxer
    May 9, 2025
    20
    等到 47 天后的时候,我应该已经不用操心了哇

    另外:最近把所有免费的全部改成付费的了
    hefish
    hefish
    May 9, 2025
    21
    @hellolinuxer 付费的也是 47 天一换。

    我是用的系统自带的 certbot + cloudflare dns plugin
    hellolinuxer
    hellolinuxer
    May 9, 2025
    22
    @hefish 我的意思是现在不操心免不免费了,能省事就省事(暂时还能够买 1 年期证书),后续平台都会解决的,自托管的也会有更成熟的解决方案
    ysc3839
    ysc3839
    May 9, 2025❤️9
    23
    我选择使用 lego https://go-acme.github.io/lego/ 自动更新证书

    同时个人不建议使用 acme.sh 。
    很多人使用 acme.sh 是觉得 shell 脚本安装简单,没有外部依赖。实际上 shell 脚本因为自身功能太弱,很多功能都要依赖外部工具实现,如提取字符串需要依赖外部的 grep 。加上 shell 脚本是动态解释运行的,如果缺失了某个依赖的程序,只有实际运行到才会报错,很容易遇到执行了一半出错的情况。
    我以前在特殊的路由器系统上运行 acme.sh ,就遇到了很多依赖缺失的情况。虽然说脚本可以在启动时进行检测,但是这也是要人工添加的,难免会有疏漏。
    其次 shell 脚本没有解析 JSON 的能力,外部解析 JSON 的工具如 jq 等又要额外安装,所以很多情况下会直接用 grep 正则表达式提取 JSON 中的数据,这么做有提取出错的风险。
    最后 shell 脚本很容易把变量等数据当成代码执行,出现远程代码执行漏洞的风险较高,同时 acme.sh 曾经确实出现过远程代码执行漏洞。

    选择使用 lego ,是因为它基于 Golang ,真正实现了单文件无外部依赖。不足之处是不支持自动添加定时任务,只能手动配置。
    lnkn
    lnkn
    May 9, 2025
    24
    插眼关注下大佬们的方案
    coldle
    coldle
    May 10, 2025 via Android
    25
    #23
    +1, 这种活交给无依赖的单文件二进制干非常安逸
    iceecream
    iceecream
    May 10, 2025
    26
    突然想到一个问题,这种证书过期之后会被吊销。但是随着这种短期证书越来越多,证书的 CRL 列表会越来越大。这种证书 CA 是怎么来来保证查询吊销列表顺畅的。
    docx
    docx
    May 10, 2025 via iPhone
    27
    acme 是小事,主要是第三方平台要全部同步过去。比如同时用了几家 CDN ,要把 acme 签好的证书上传给他们并更新生效,暂时还没有太好的办法。
    NewYear
    NewYear
    May 10, 2025
    28
    @iceecream #26

    有效期内的证书,同时又需要吊销的,肯定是比以前更少的。。。。
    hausen
    hausen
    May 10, 2025 via Android
    29
    @docx certd 很多插件支持
    Actrace
    Actrace
    May 10, 2025❤️1
    30
    vx.link 是我用过的最简单的 SSL 自动证书,没有之一。
    realpg
    realpg
    May 10, 2025
    31
    cursor 两次对话 50 分钟 完成 acme.sh 自动化签证书后 post-cert-script 自动上传阿里云腾讯云
    并对阿里云腾讯云的所有 CDN 域名智能应用新证书
    对阿里云腾讯云的所有负载均衡器智能应用新证书
    realpg
    realpg
    May 10, 2025
    32
    @docx #27
    看楼上
    JFZ
    JFZ
    May 10, 2025
    33
    换 http 。不伺候了
    Hanada
    Hanada
    May 10, 2025 via Android
    34
    @jiuhuicinv 现在 chrome 已经开始在访问 http 网站时提醒不安全了(是直接弹窗提醒,你点击确认之后才能继续浏览那种)。保不齐到时候真的会访问 http 直接给你来个红色页面,把 http 网站打成像诈骗网站一样的级别
    383394544
    383394544
    PRO
    May 10, 2025
    35
    acme.sh 可以签二级的 wildcard 证书,写脚本定期在主服务器上签一遍再 scp 推送到其他服务器就好。
    JFZ
    JFZ
    May 10, 2025
    36
    @Hanada 反正写的自用接口不再关心 SSL 了(有部署证书但不强制 https 请求)。浏览器和网站的问题到时候再说吧,相信后人的智慧
    GoodRui
    GoodRui
    May 10, 2025 via Android
    37
    怎么没人提 certimate ?
    难道是太新太过先进了,知道的人太少吗?
    xiangyuecn
    xiangyuecn
    May 10, 2025❤️1
    38
    原则上,SSL 配置这玩意默认不应该让开发者去操心,比如默认由 Nginx 之类的全自动实现。

    就和在坐的各位一样,绝大部分 web 服务器压根不关心 https 是怎样的,只关心用户能不能正常访问,管你妈的是 https 还是啥玩意😂
    dnsjia
    dnsjia
    May 10, 2025
    39
    lekai63
    lekai63
    May 10, 2025 via iPhone
    40
    勇证书一般有 web 服务提供吧,用到 nginx 吧

    以前我用 1 楼说的 nginx proxy manager
    现在我用 nginx-ui (资源占用稍微小点)

    当然 都不如只跑 nginx 站用小
    Rache1
    Rache1
    May 10, 2025❤️2
    41
    @xiangyuecn #38 你可能在找 Caddy
    javazero
    javazero
    May 10, 2025 via Android
    42
    免费的 acme.sh 其实完全可以,只是需要沉下心来搞个一下午把所有自动化写好就行了。不过确实麻烦
    Panameragt
    Panameragt
    May 10, 2025
    43
    太对全自动的方案了 ,比如一楼
    Damn
    Damn
    May 10, 2025 via iPhone
    44
    @ysc3839 好像 Lego 没有 acme.sh 的 dns-alias mode ?
    Damn
    Damn
    May 10, 2025 via iPhone
    45
    @ysc3839 看 doc 它要验 soa
    holoto
    holoto
    May 10, 2025
    46
    域名挂到 cf 解析。用 cloudflared tunnel 替换 nginx 或者 apache 。
    1una
    1una
    May 10, 2025
    47
    acme.sh 是一个 8000 多行的 shell 脚本,感觉没有 23 楼提到的 Lego 靠谱。要么就用 Caddy / Traefik ,内置 ACME 协议支持
    ysc3839
    ysc3839
    May 10, 2025 via Android
    49
    @Damn dns-alias mode 具体是什么?我自己试过 Cloudflare 子域名 NS 托管给其他服务商,是正常的。
    summer2019
    summer2019
    May 10, 2025 via iPhone
    50
    @GoodRui 折腾过,折腾一个下午一直卡在 dns 提供商那一步,一直请求失败。实在折腾累了,遂放弃
    beyondstars
    beyondstars
    May 10, 2025
    51
    自建服务(or 内部服务)用自签证书,公开服务用任何基于 acme 的自动化方案。
    luofeiff6666
    luofeiff6666
    May 10, 2025
    52
    nginx proxy manager
    Greendays
    Greendays
    May 10, 2025
    53
    如果是部署在第三方服务器上托管的业务,那可有罪受了。
    shiny
    shiny
    PRO
    May 10, 2025
    54
    我自己写了一个,其实也没很难 https://github.com/shiny/handyacme
    Damn
    Damn
    May 10, 2025 via iPhone
    55
    @ysc3839 比如我有一个 target.domain
    我可以把_acme-challenge.target.domain 通过 cname 指向 other.domain ,acme.sh 可以去操作 other.domain 的 dns 记录来实现给 target.domain 发证书。
    bigbigeggs
    bigbigeggs
    May 10, 2025
    56
    acme.sh https://juejin.cn/post/7460410854775242802
    没遇到楼上说的几个问题,用下来方便得很
    crackidz
    crackidz
    May 10, 2025
    57
    ACME 3 个月自动续期一下就好了
    ENE
    ENE
    May 10, 2025
    58
    因为我是 docker 运行 nginx 的,所以用 acme.sh 自动更新的,你可看看这个教程[使用 docker acme 申请、续订泛域名证书,并自动重载[docker nginx]( https://sleele.com/2021/04/15/docker-acme-with-docker-nginx/)
    memcache
    memcache
    May 10, 2025
    59
    nginx proxy mananger 能自动续签
    GoodRui
    GoodRui
    May 10, 2025 via Android
    60
    @summer2019 这个都是傻瓜式的点点点有什么难的吗...dns 提供商配置那里,如果你用阿里云或者腾讯云的话,就只需要输入个 access id 和 key 不就行了...别的都不用管啊
    vytvex
    vytvex
    May 10, 2025 via Android
    61
    有些不太明白能解釋一下嗎? Cloudflare origin 證書能用 5 年,為甚麼要在意對外的 ssl cert?
    eslizn
    eslizn
    May 10, 2025
    62
    traefik + ingress annotation 很 easy 的解决方案了
    RW5kZXJBdmFyaXRp
    RW5kZXJBdmFyaXRp
    May 11, 2025
    63
    acme 和 win-acme ,自己去 git 搜
    之后用 nginx 统一代理转发
    v2er119
    v2er119
    May 11, 2025
    64
    AI 写脚本,监控+提醒+certbot 自动申请
    https://maifeipin.com/archives/zi-dong-bu-shu-xi-tong-jian-kong-jiao-ben
    只需替换你的邮箱和 tencentcloud.ini (对应的域名 API key ) 就行了


    ···
    #!/bin/bash

    THRESHOLD=7
    CREDENTIALS="/etc/letsencrypt/tencentcloud.ini"
    EMAIL="[email protected]"
    EMAIL_ARG="--email $EMAIL"
    # EMAIL_ARG="--register-unsafely-without-email"

    nginx_conf_dirs=(
    "/etc/nginx/nginx.conf"
    "/etc/nginx/conf.d/"
    "/etc/nginx/sites-enabled/"
    "/etc/nginx/sites-available/"
    "/usr/local/nginx/conf/"
    )

    nginx_cert_files=$(mktemp)
    for conf_dir in "${nginx_conf_dirs[@]}"; do
    if [ -d "$conf_dir" ]; then
    find "$conf_dir" -type f -name "*.conf" 2>/dev/null | while read -r file; do
    grep -E '^\s*ssl_certificate\s+' "$file" | awk '{print $2}' | sed "s/['\";]//g" >> "$nginx_cert_files"
    done
    elif [ -f "$conf_dir" ]; then
    grep -E '^\s*ssl_certificate\s+' "$conf_dir" | awk '{print $2}' | sed "s/['\";]//g" >> "$nginx_cert_files"
    fi
    done

    sort -u "$nginx_cert_files" -o "$nginx_cert_files"

    while read -r cert_path; do
    if [ -z "$cert_path" ]; then continue; fi
    if [ ! -f "$cert_path" ]; then
    echo "证书文件: $cert_path (未找到!)"
    echo "-----------------------------"
    continue
    fi

    expiry_date=$(openssl x509 -noout -enddate -in "$cert_path" 2>/dev/null | cut -d= -f2)
    expiry_epoch=$(date -d "$expiry_date" +%s)
    now_epoch=$(date +%s)
    days_left=$(( (expiry_epoch - now_epoch) / 86400 ))

    all_domains=$(openssl x509 -noout -text -in "$cert_path" 2>/dev/null | grep "DNS:" | sed 's/.*DNS://;s/, /\n/g' | tr '\n' ' ')

    if [ $days_left -le $THRESHOLD ]; then
    main_domain=$(echo "$all_domains" | awk '{print $1}')
    echo "证书文件: $cert_path"
    echo " 包含域名: $all_domains"
    echo " 过期时间: $expiry_date (剩余 $days_left 天)"
    echo " 证书即将过期或已过期,自动续期..."

    certbot certonly \
    -a dns-tencentcloud \
    --dns-tencentcloud-credentials "$CREDENTIALS" \
    -d $all_domains \
    $EMAIL_ARG \
    --non-interactive --agree-tos \
    --keep-until-expiring

    if [ $? -eq 0 ]; then
    echo " 证书续期成功"
    # 自动覆盖 Nginx 实际用的证书
    src_cert="/etc/letsencrypt/live/$main_domain/fullchain.pem"
    src_key="/etc/letsencrypt/live/$main_domain/privkey.pem"
    if [ -f "$src_cert" ] && [ -f "$src_key" ]; then
    # 只在 Nginx 用的路径和 Let’s Encrypt 路径不一致时覆盖
    if [ "$cert_path" != "$src_cert" ]; then
    cp -f "$src_cert" "$cert_path"
    echo " 已覆盖 Nginx 用的证书: $cert_path"
    fi
    # 查找 key 路径
    key_path=$(grep -E '^\s*ssl_certificate_key\s+' /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf /etc/nginx/sites-enabled/* /etc/nginx/sites-available/* /usr/local/nginx/conf/*.conf 2>/dev/null | grep "$main_domain" | awk '{print $2}' | sed "s/['\";]//g" | head -n1)
    if [ -n "$key_path" ] && [ "$key_path" != "$src_key" ]; then
    cp -f "$src_key" "$key_path"
    echo " 已覆盖 Nginx 用的私钥: $key_path"
    fi
    fi
    systemctl reload nginx
    else
    echo " 证书续期失败"
    fi
    else
    echo "证书文件: $cert_path"
    echo " 包含域名: $all_domains"
    echo " 过期时间: $expiry_date (剩余 $days_left 天)"
    fi
    echo "-----------------------------"
    done < "$nginx_cert_files"

    rm -f "$nginx_cert_files"

    ···
    irainsoft
    irainsoft
    May 11, 2025
    65
    @vytvex #61 你自己都明白了是 origin ssl ,这是 Cloudflare 边缘节点和你源站服务器之间的通信,其实就是一个内部信任的自签证书而已。如果你拿这个证书去做面向用户的 SSL ,那用户侧看到的就是不受信任的根证书错误( SSL 红屏错误)。如果真的不在意这个,不如自己拿 openssl 签一个 100 年的了。
    Alliot
    Alliot
    May 11, 2025
    66
    certbot 加上 deploy-hook 自己实现。
    一个证书管理没必要引入太多依赖。
    ysc3839
    ysc3839
    May 11, 2025 via Android
    67
    @Damn 不知道,有空我试试
    azarasi
    azarasi
    May 11, 2025
    68
    crontab+certbot 不行吗?
    imlonghao
    imlonghao
    May 11, 2025
    69
    @Damn 有的兄弟 `CNAME support by default` https://go-acme.github.io/lego/index.html
    imlonghao
    imlonghao
    May 11, 2025
    70
    @iceecream 分组的,多少张证书用一个 CRL 地址
    coolfan
    coolfan
    May 11, 2025 via Android
    71
    在用 certd ,狠下心所有服务器配置一遍。(其实也就第一个服务器配置久一点,后面几个都是复制黏贴)
    bronyakaka
    bronyakaka
    May 11, 2025
    72
    certbot 很稳,别碰 caddy
    summer2019
    summer2019
    May 11, 2025
    73
    @GoodRui 话是这么说,但是填进去用不了。acme.sh 都没问题,它就用不了。腾讯云的填过,dnspod 的也填过,用不了,然后删了
    Hantong
    Hantong
    May 12, 2025
    74
    acme.sh 主要是重复签发,很多台机器都要来一遍好麻烦,功能性非常好了,算是事实上的标准之一?

    不知道有没有开源的单机部署然后把证书文件推送到其他机器的方案,然后自动触发服务重载。
    vipnetant
    vipnetant
    May 12, 2025
    75
    我用 certd ,非常好用,前期配置好,后面无感。
    有报错就发邮件提醒,没错就无感。
    dajj
    dajj
    May 12, 2025
    76
    cloudflare 边缘证书
    imlonghao
    imlonghao
    May 12, 2025 via iPhone
    77
    certd 的 git history 里一堆 chore: 有点难绷
    salmon5
    salmon5
    May 12, 2025
    78
    你们这都是个人的小玩具项目,参考价值不大
    有没有阿里、腾讯负责证书的分享下?这么多证书节点,到时候怎么弄?
    lyxxxh2
    lyxxxh2
    May 12, 2025
    79
    宝塔那个续签有毒,还不如让 ai 写。
    chutianyao
    chutianyao
    May 12, 2025
    80
    @azarasi 我用 certbot,把自动续期功能也都放到容器了, 不需要再宿主机上执行 crontab 了
    wanniwa
    wanniwa
    May 12, 2025
    81
    @qbmiller 我域名阿里云买的,备案在阿里云,解析地址迁移到 cf ,但是这几天收到消息说如果不迁回来,备案要撤销。。。
    abc0123xyz
    abc0123xyz
    May 12, 2025
    82
    caddy
    qbmiller
    qbmiller
    May 12, 2025
    83
    @wanniwa 我是今年服务器也换到腾讯云-新加坡了
    flynaj
    flynaj
    May 12, 2025 via Android
    84
    acme.sh 就可以,不用去折腾他的。
    zushi000
    zushi000
    May 13, 2025❤️1
    85
    刚用,给微林打个广告.vx.link.点一下就申请.然后自动给你续期.自己写个脚本把文件复制过去就行了.邀请码网上可以搜到
    gujiwork
    gujiwork
    May 13, 2025
    86
    一直在用 SSL 智管平台的自动签发、自动部署到云服务和 SLB ,很方便。添加后基本上不需要再管它。 https://ssl.dnsjia.com
    Damn
    Damn
    May 28, 2025 via iPhone
    87
    @imlonghao 它是写了 by default 。
    但不知道你仔细看过它的 doc 没有?
    它的 doc ,也就是你发的链接,都不写咋用。
    颁发 a.com 的证书,_acme-challenge.a.com 通过 cname 到 any.b.com 之后,你是要去操作 any.b.com 的 dns 记录,不给参数,它 Lego 能凭空知道你要去操作 b.com ?

    doc 里都不写咋用,难道让每个有需求的人都去看源代码?
    imlonghao
    imlonghao
    May 29, 2025
    88
    @Damn 这还需要特别写怎么用么... 凭借直觉 CNAME 到 any.b.com ,自然给他配置 b.com 的权限就好了

    > 它 Lego 能凭空知道你要去操作 b.com

    并非凭空,他会去自己查 SOA 记录,然后操作对应的域名
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5219 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 228ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    ♥ Do have faith in what you're doing.