V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
kincaid
V2EX  ›  云计算

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

  •  
  •   kincaid · 10 天前 · 7178 次点击
    看到宝塔面板发的视频感觉有点不好玩啊 https://www.bilibili.com/video/BV1Ru5uzMEi9/

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

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

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

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

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

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

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

    我是用的系统自带的 certbot + cloudflare dns plugin
    hellolinuxer
        22
    hellolinuxer  
       10 天前
    @hefish 我的意思是现在不操心免不免费了,能省事就省事(暂时还能够买 1 年期证书),后续平台都会解决的,自托管的也会有更成熟的解决方案
    ysc3839
        23
    ysc3839  
       10 天前   ❤️ 9
    我选择使用 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
        24
    lnkn  
       10 天前
    插眼关注下大佬们的方案
    coldle
        25
    coldle  
       10 天前 via Android
    #23
    +1, 这种活交给无依赖的单文件二进制干非常安逸
    iceecream
        26
    iceecream  
       10 天前
    突然想到一个问题,这种证书过期之后会被吊销。但是随着这种短期证书越来越多,证书的 CRL 列表会越来越大。这种证书 CA 是怎么来来保证查询吊销列表顺畅的。
    docx
        27
    docx  
       10 天前 via iPhone
    acme 是小事,主要是第三方平台要全部同步过去。比如同时用了几家 CDN ,要把 acme 签好的证书上传给他们并更新生效,暂时还没有太好的办法。
    NewYear
        28
    NewYear  
       10 天前
    @iceecream #26

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

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

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

    当然 都不如只跑 nginx 站用小
    Rache1
        41
    Rache1  
       9 天前   ❤️ 2
    @xiangyuecn #38 你可能在找 Caddy
    javazero
        42
    javazero  
       9 天前 via Android
    免费的 acme.sh 其实完全可以,只是需要沉下心来搞个一下午把所有自动化写好就行了。不过确实麻烦
    Panameragt
        43
    Panameragt  
       9 天前
    太对全自动的方案了 ,比如一楼
    Damn
        44
    Damn  
       9 天前 via iPhone
    @ysc3839 好像 Lego 没有 acme.sh 的 dns-alias mode ?
    Damn
        45
    Damn  
       9 天前 via iPhone
    @ysc3839 看 doc 它要验 soa
    holoto
        46
    holoto  
       9 天前
    域名挂到 cf 解析。用 cloudflared tunnel 替换 nginx 或者 apache 。
    1una
        47
    1una  
       9 天前
    acme.sh 是一个 8000 多行的 shell 脚本,感觉没有 23 楼提到的 Lego 靠谱。要么就用 Caddy / Traefik ,内置 ACME 协议支持
    ysc3839
        49
    ysc3839  
       9 天前 via Android
    @Damn dns-alias mode 具体是什么?我自己试过 Cloudflare 子域名 NS 托管给其他服务商,是正常的。
    summer2019
        50
    summer2019  
       9 天前 via iPhone
    @GoodRui 折腾过,折腾一个下午一直卡在 dns 提供商那一步,一直请求失败。实在折腾累了,遂放弃
    beyondstars
        51
    beyondstars  
       9 天前
    自建服务(or 内部服务)用自签证书,公开服务用任何基于 acme 的自动化方案。
    luofeiff6666
        52
    luofeiff6666  
       9 天前
    nginx proxy manager
    Greendays
        53
    Greendays  
       9 天前
    如果是部署在第三方服务器上托管的业务,那可有罪受了。
    shiny
        54
    shiny  
       9 天前
    我自己写了一个,其实也没很难 https://github.com/shiny/handyacme
    Damn
        55
    Damn  
       9 天前 via iPhone
    @ysc3839 比如我有一个 target.domain
    我可以把_acme-challenge.target.domain 通过 cname 指向 other.domain ,acme.sh 可以去操作 other.domain 的 dns 记录来实现给 target.domain 发证书。
    bigbigeggs
        56
    bigbigeggs  
       9 天前
    acme.sh https://juejin.cn/post/7460410854775242802
    没遇到楼上说的几个问题,用下来方便得很
    crackidz
        57
    crackidz  
       9 天前
    ACME 3 个月自动续期一下就好了
    ENE
        58
    ENE  
       9 天前
    因为我是 docker 运行 nginx 的,所以用 acme.sh 自动更新的,你可看看这个教程[使用 docker acme 申请、续订泛域名证书,并自动重载[docker nginx]( https://sleele.com/2021/04/15/docker-acme-with-docker-nginx/)
    memcache
        59
    memcache  
       9 天前
    nginx proxy mananger 能自动续签
    GoodRui
        60
    GoodRui  
       9 天前 via Android
    @summer2019 这个都是傻瓜式的点点点有什么难的吗...dns 提供商配置那里,如果你用阿里云或者腾讯云的话,就只需要输入个 access id 和 key 不就行了...别的都不用管啊
    vytvex
        61
    vytvex  
       9 天前 via Android
    有些不太明白能解釋一下嗎? Cloudflare origin 證書能用 5 年,為甚麼要在意對外的 ssl cert?
    eslizn
        62
    eslizn  
       9 天前
    traefik + ingress annotation 很 easy 的解决方案了
    EnderAvaritia
        63
    EnderAvaritia  
       9 天前
    acme 和 win-acme ,自己去 git 搜
    之后用 nginx 统一代理转发
    v2er119
        64
    v2er119  
       8 天前
    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
        65
    irainsoft  
       8 天前
    @vytvex #61 你自己都明白了是 origin ssl ,这是 Cloudflare 边缘节点和你源站服务器之间的通信,其实就是一个内部信任的自签证书而已。如果你拿这个证书去做面向用户的 SSL ,那用户侧看到的就是不受信任的根证书错误( SSL 红屏错误)。如果真的不在意这个,不如自己拿 openssl 签一个 100 年的了。
    Alliot
        66
    Alliot  
       8 天前
    certbot 加上 deploy-hook 自己实现。
    一个证书管理没必要引入太多依赖。
    ysc3839
        67
    ysc3839  
       8 天前 via Android
    @Damn 不知道,有空我试试
    azarasi
        68
    azarasi  
       8 天前
    crontab+certbot 不行吗?
    imlonghao
        69
    imlonghao  
       8 天前
    @Damn 有的兄弟 `CNAME support by default` https://go-acme.github.io/lego/index.html
    imlonghao
        70
    imlonghao  
       8 天前
    @iceecream 分组的,多少张证书用一个 CRL 地址
    coolfan
        71
    coolfan  
       8 天前 via Android
    在用 certd ,狠下心所有服务器配置一遍。(其实也就第一个服务器配置久一点,后面几个都是复制黏贴)
    bronyakaka
        72
    bronyakaka  
       8 天前
    certbot 很稳,别碰 caddy
    summer2019
        73
    summer2019  
       8 天前
    @GoodRui 话是这么说,但是填进去用不了。acme.sh 都没问题,它就用不了。腾讯云的填过,dnspod 的也填过,用不了,然后删了
    Hantong
        74
    Hantong  
       8 天前
    acme.sh 主要是重复签发,很多台机器都要来一遍好麻烦,功能性非常好了,算是事实上的标准之一?

    不知道有没有开源的单机部署然后把证书文件推送到其他机器的方案,然后自动触发服务重载。
    vipnetant
        75
    vipnetant  
       7 天前
    我用 certd ,非常好用,前期配置好,后面无感。
    有报错就发邮件提醒,没错就无感。
    dajj
        76
    dajj  
       7 天前
    cloudflare 边缘证书
    imlonghao
        77
    imlonghao  
       7 天前 via iPhone
    certd 的 git history 里一堆 chore: 有点难绷
    salmon5
        78
    salmon5  
       7 天前
    你们这都是个人的小玩具项目,参考价值不大
    有没有阿里、腾讯负责证书的分享下?这么多证书节点,到时候怎么弄?
    lyxxxh2
        79
    lyxxxh2  
       7 天前
    宝塔那个续签有毒,还不如让 ai 写。
    chutianyao
        80
    chutianyao  
       7 天前
    @azarasi 我用 certbot,把自动续期功能也都放到容器了, 不需要再宿主机上执行 crontab 了
    wanniwa
        81
    wanniwa  
       7 天前
    @qbmiller 我域名阿里云买的,备案在阿里云,解析地址迁移到 cf ,但是这几天收到消息说如果不迁回来,备案要撤销。。。
    abc0123xyz
        82
    abc0123xyz  
       7 天前
    caddy
    qbmiller
        83
    qbmiller  
       7 天前
    @wanniwa 我是今年服务器也换到腾讯云-新加坡了
    flynaj
        84
    flynaj  
       7 天前 via Android
    acme.sh 就可以,不用去折腾他的。
    zushi000
        85
    zushi000  
       6 天前   ❤️ 1
    刚用,给微林打个广告.vx.link.点一下就申请.然后自动给你续期.自己写个脚本把文件复制过去就行了.邀请码网上可以搜到
    gujiwork
        86
    gujiwork  
       6 天前
    一直在用 SSL 智管平台的自动签发、自动部署到云服务和 SLB ,很方便。添加后基本上不需要再管它。 https://ssl.dnsjia.com
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:55 · PVG 05:55 · LAX 14:55 · JFK 17:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.