V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bigbugbag
V2EX  ›  程序员

有没有 acme.sh 的替代品?

  •  
  •   bigbugbag · 86 天前 · 4595 次点击
    这是一个创建于 86 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我寻找替代品的原因如下:

    1. acme.sh 的 docker hook 无法向多个 container 部署证书。
    2. 开发者维护的积极性看起来比较低了,已经堆积了很多个 issue 与 PR 。

    希望替代品具有以下功能:

    1. acme.sh 一样,可以运行在 Docker 中,体积与占用要低,申请证书后可以自动续签与部署。
    2. 可以向多个 docker contaier 部署证书。
    3. 社区最好还很活跃。

    如果没有替代品的话,我只能用挂载证书的方式来解决这个问题了。

    第 1 条附言  ·  85 天前
    准备使用 Lego https://github.com/go-acme/lego 替代 acme.sh ,原因如下:

    1. Lego 是 Go 写的,比起 shell 代码更易读,我也相对熟悉 Go
    2. Traefik 使用的证书库就是 Lego ,作者也是 Traefik 和很多大项目的 member
    3. 文档很简洁,很清晰
    4. 项目较为活跃

    Lego 支持 Running a script afterward ,在这里面可以做证书的分发操作。
    文档见: https://go-acme.github.io/lego/usage/cli/renew-a-certificate/index.html#running-a-script-afterward

    起了一个项目,准备利用 Docker client 和 Docker label 来进行证书的自动分发与下游服务的更新,行为类似于 acme.sh 的 Docker hook ,目前还在开发中。
    项目见: https://github.com/rea1shane/lego-docker-helper
    29 条回复    2024-09-04 12:37:36 +08:00
    EvineDeng
        1
    EvineDeng  
       86 天前   ❤️ 1
    zx9481
        2
    zx9481  
       86 天前
    zhaidoudou123
        3
    zhaidoudou123  
       86 天前
    😂我就是在每个 docker 弄个挂载目录到宿主机上来更新证书的,原来还可以有别的方法
    bigbugbag
        4
    bigbugbag  
    OP
       86 天前
    @zhaidoudou123 当然,见文档 https://github.com/acmesh-official/acme.sh/wiki/deploy-to-docker-containers

    但是目前只能向一个容器部署,比如我有两个容器都打上了标签 `--label=sh.acme.autoload.domain=example.com`,只有一个容器会被部署证书。
    yy306525121
        5
    yy306525121  
       86 天前
    CERTBOT 好像可以, 了解过但是没用过, 自己研究一下
    yikyo
        6
    yikyo  
       86 天前
    不需要跨服务的话,可以使用 traefik ,自动申请证书,反向代理各个服务。定义 label 就可以使用。

    我是从 traefik 回到 acme.sh ,泛域名证书,需要跨主机使用,所以用 acme.sh ,输出到特定目录,再共享给其他主机使用。
    yinmin
        7
    yinmin  
       86 天前
    你是在 docker 里运行 acme.sh 的吧。我的操作方式是 volume 挂接的方式,将证书目录同时挂接到 acme.sh 容器和证书使用容器。在宿主机的 crontab 里写一个定时任务运行 acme_update.sh

    acme_update.sh 的流程是:
    (1) docker 运行 acme 更新证书,如果证书被更新会在 pending 目录里 touch 一个.sh 空文件做标记
    (2) 宿主机检查 pending 目录是是否存在.sh 文件,如果有的话,运行在 prog 目录下的同名文件
    (3) 删除 pending 目录下的.sh 文件

    通过第二步,在证书更新后能 restart 对应容器或者让容器 reload 配置。因为是检查 pending 目录的文件,但是运行 prog 目录下的同名文件,prog 目录没有挂接到容器里,所以比较安全。

    然后在宿主机上写一个 alias ,类似如下:
    alias acme.sh="docker run --rm -v /docker/acme/pending:/acme/pending -v /docker/acme/acme.sh:/acme.sh -v /var/cert:/var/cert neilpang/acme.sh"
    (文件认证模式需要加上 web 目录的 volume ,dns 认证第一次需要加上环境变量,之后可以删除掉)

    将来使用的时候,就是直接 acme.sh 操作,使用也很方便。acme_update.sh 可以让 gpt/claude 写一下。
    Latin
        8
    Latin  
       86 天前
    bigbugbag
        9
    bigbugbag  
    OP
       86 天前
    @yinmin 这种方式确实解决了问题,但是对宿主机有侵入性的操作,不太符合我的预期。

    另外,有些服务确实没有重载证书的命令(比如 Traefik ),只能 restart 容器,这一步大概率要侵入宿主机,我还不知道有什么比较好的解决方式。
    EvilYZ
        10
    EvilYZ  
       86 天前
    bigbugbag
        11
    bigbugbag  
    OP
       86 天前
    @EvilYZ Traefik 有办法将证书拷贝到其他服务中么?
    lesterholy
        12
    lesterholy  
       86 天前
    所以你是需要个证书的分发程序?我是签好证书之后,传到七牛上,谁用谁自己去下,最后 nginx -s reload 不过我弄的泛域名证书
    leiletter
        13
    leiletter  
       86 天前
    前几天装了 certd ,还可以。但是最新版升级了付费权益,我没有仔细看。似乎限制部署主机数量。OP 可以了解看看
    EvilYZ
        14
    EvilYZ  
       86 天前
    #11 你后面的服务不是反代出去吗?
    bigbugbag
        15
    bigbugbag  
    OP
       86 天前
    @EvilYZ #14 有部分服务不需要反代,但是需要证书
    EvilYZ
        16
    EvilYZ  
       86 天前
    #15 可以看看这个满不满足你的需求 https://www.zctou.com/2061.html
    bigbugbag
        17
    bigbugbag  
    OP
       86 天前
    @EvilYZ #16 算是解决方案之一了,但我还是更倾向使用其他工具来管理证书而不是一个反向代理服务,纯个人偏好
    bugfan
        18
    bugfan  
       86 天前
    https://www.i996.me/#/mine

    这里面下面有一个简易的,直接通过 curl 拉证书 json,也可以直接下载到本地某个目录里。完事需要你自己-s reload 一下之类的。

    签发方式简单但是另类
    shengchao
        19
    shengchao  
       86 天前
    额.
    caddy
    jqtmviyu
        20
    jqtmviyu  
       86 天前
    lego + shell 脚本 + crontab.

    go 编译的程序不用管运行时和依赖, 用起来太舒服了.
    NoInternet
        21
    NoInternet  
       86 天前
    没有人提 certbot ,这个有什么问题吗?
    ysc3839
        22
    ysc3839  
       86 天前 via Android
    @NoInternet 依赖 Python ,太重了
    huangzhiyia
        23
    huangzhiyia  
       86 天前
    sudo docker run -it --rm --name certbot \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    certbot/certbot certonly
    yinmin
        24
    yinmin  
       86 天前 via iPhone
    @bigbugbag #9 你仔细看看我的方案,acme 只是标记要运行哪个 sh 脚本,而不会生成脚本,很难入侵的。

    你拿#7 的原文发给 gpt4/claude 3.5 ,ai 会给出对应脚本的。
    Rocketer
        25
    Rocketer  
       86 天前 via iPhone
    可是同样的证书为什么要各自续签呢?我都是弄个 hub 服务器,证书只在这个服务器上更新,然后各实例自己来 pull 。

    其实 pull 的不只是证书,各种配置都是通过这种机制下发的,所有更改都只需要更新 hub 服务器。hub 自身也可以做主从,以防挂掉影响所有服务。
    ratazzi
        26
    ratazzi  
       85 天前
    我是自己写的,高度定制,简化版本,只支持 DNS 模式 ECC 证书,跑在 Cloudflare Workers 上,不需要自己维护服务器,因为多年的折腾发现没有一个主机我能长期维护,可以说依赖很重也可以说只依赖一个 curl
    Actrace
        27
    Actrace  
       85 天前
    vx.link 有证书服务,设置一下 DNS 就可以完成证书申请,证书自动更新。
    然后自己在主机定时 pull 更新就行,都有提供现成脚本。
    daisyfloor
        28
    daisyfloor  
       85 天前
    那只能是 Caddy 了
    npe
        29
    npe  
       85 天前 via iPhone
    certbot
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2672 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:49 · PVG 23:49 · LAX 07:49 · JFK 10:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.