不用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 段替换成与你站点匹配的版本。

浙公网安备 33010602011771号