不用cerbot和acme.sh让nginx实现类似caddy一样自动获取和续期的ssl证书

内容由cursor生成、

简短结论:Nginx 本体没有像 Caddy 那样“内置 ACME 自动签发/续期”的官方功能;不使用 certbot/acme.sh 的情况下,最成熟可用的做法是用 OpenResty(带 Lua)+ lua-resty-auto-ssl,在 Nginx 层内自动申请和续期证书。

给你一个最小可用的方案(RHEL/OpenCloudOS 系):

- 安装 OpenResty 和自动证书组件

# 安装 OpenResty 官方仓库
sudo dnf install -y yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/openresty.repo
sudo dnf install -y openresty openresty-resty

# 安装 lua-resty-auto-ssl(OPM)
sudo /usr/local/openresty/bin/opm get ledgetech/lua-resty-auto-ssl

- 创建存储目录并授权

sudo mkdir -p /etc/resty-auto-ssl
sudo chown -R nobody:nobody /etc/resty-auto-ssl


- 示例配置(/usr/local/openresty/nginx/conf/nginx.conf)
仅示意关键段,按你的路径/域名调整。
```nginx

worker_processes auto;
events { worker_connections  1024; }

http {
    lua_shared_dict auto_ssl 64m;
    lua_shared_dict auto_ssl_settings 64k;

    # 用于 OCSP/ACME 解析
    resolver 8.8.8.8 1.1.1.1 ipv6=off;

    init_by_lua_block {
        local auto_ssl = require("resty.auto-ssl").new()
        auto_ssl:set("dir", "/etc/resty-auto-ssl")
        auto_ssl:set("allow_domain", function(domain)
            -- 白名单,避免被滥用。写上你的域名:
            return (domain == "example1.com" or domain == "www.example1.com"
                    or domain == "example2.com" or domain == "www.example2.com")
        end)
        auto_ssl:init()
    }

    init_worker_by_lua_block {
        require("resty.auto-ssl").init_worker()
    }

    # ACME 挑战回调服务(必需)
    server {
        listen 127.0.0.1:8999;
        location / {
            content_by_lua_block {
                require("resty.auto-ssl").challenge_server()
            }
        }
    }

    # 80 端口:需放通给 ACME HTTP-01 挑战
    server {
        listen 80 default_server reuseport;
        server_name _;
        location /.well-known/acme-challenge/ {
            content_by_lua_block {
                require("resty.auto-ssl").challenge_server()
            }
        }
        # 其他全部 301 到 https(可选)
        location / {
            return 301 https://$host$request_uri;
        }
    }

    # 443 端口:自动证书
    server {
        listen 443 ssl http2 reuseport;
        server_name example1.com www.example1.com example2.com www.example2.com;

        # 由 auto-ssl 动态提供证书(关键)
        ssl_certificate_by_lua_block {
            require("resty.auto-ssl").ssl_certificate()
        }
        # 兜底自签证书(首次握手前需要),auto-ssl 安装包自带:
        ssl_certificate      /usr/local/openresty/nginx/conf/ssl/resty-auto-ssl-fallback.crt;
        ssl_certificate_key  /usr/local/openresty/nginx/conf/ssl/resty-auto-ssl-fallback.key;

        # 你自己的站点 upstream/静态根/反代等:
        # 站点1
        if ($host = example1.com) {
            set $up backend1;
        }
        if ($host = www.example1.com) {
            set $up backend1;
        }
        if ($host = example2.com) {
            set $up backend2;
        }
        if ($host = www.example2.com) {
            set $up backend2;
        }

        # 示例:静态根(按需切换成 proxy_pass/PHP 等)
        set $root "";
        if ($up = backend1) { set $root /www/wwwroot/example1.com; }
        if ($up = backend2) { set $root /www/wwwroot/example2.com; }

        root $root;
        index index.html index.htm;
        location / { try_files $uri $uri/ =404; }
    }
}


- 启动/重载
```bash

sudo systemctl enable --now openresty
sudo systemctl status openresty | cat


要点
- 必须开放 80/443,并且域名 DNS 指向此机,ACME 才能通过 HTTP-01 验证。
- `allow_domain` 里务必列白名单,防止被人借你服务器代签证书。
- 证书获取与续期全自动,无需 certbot/acme.sh。
- 若你已有纯 Nginx,可改为 OpenResty(完全兼容大多数 Nginx 配置);或为现有 Nginx 编译 Lua 模块并接入,但工作量更大,建议直接用 OpenResty。

如果你贴出当前 Nginx 的站点配置(静态/反代/PHP),我可以把上面 443 段替换成与你站点匹配的版本。

posted @ 2025-09-05 19:14  总统先生  阅读(22)  评论(0)    收藏  举报