ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nginx Proxy Manager 证书管理完全指南:HTTP、DNS 与自定义证书的签发、续期与运维实践

Nginx Proxy Manager 证书管理完全指南:HTTP、DNS 与自定义证书的签发、续期与运维实践 Nginx Proxy Manager 证书管理完全指南HTTP、DNS 与自定义证书的签发、续期与运维实践【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager本篇指南围绕 Nginx Proxy Manager 的 SSL/TLS 证书体系展开系统讲解三类证书的获取方式——Lets Encrypt HTTP 验证、Lets Encrypt DNS 验证以及自定义证书上传并结合仓库源码backend/internal/certificate.js、backend/routes/nginx/certificates.js与前端表单实现HTTPCertificateModal.tsx、DNSCertificateModal.tsx、CustomCertificateModal.tsx讲清签发原理、前置条件、操作步骤与自动续期机制。读完本文你将能独立判断何时该用哪种证书方式、通配符域名该怎么签、自有 CA 证书如何导入并掌握证书验证、下载、续期与吊销的完整运维方法。证书体系总览三种获取方式的选型Nginx Proxy Manager 的Certificates证书模块提供三种证书获取方式其核心区别在于验证域名所有权的手段不同方式验证通道前置要求通配符支持适用场景HTTP CertificateHTTP 验证通过 HTTP非 HTTPS访问域名下的 ACME 验证路径必须已有可访问的 Proxy Host 指向本机不支持域名已解析到本机且 80 端口可公网访问DNS CertificateDNS 验证通过 DNS Provider 插件创建临时 DNS 记录无需 Proxy Host无需开放 HTTP支持通配符域名、80 端口不可用、域名解析不指向本机Custom Certificate自定义证书无直接导入持有证书与私钥文件取决于证书本身企业 CA、自建 CA、非 Lets Encrypt 证书对应的前端入口分别位于证书列表页的 Add SSL Certificate 菜单HTTP Certificate / DNS Certificate / Custom Certificate其提交逻辑分别由 HTTPCertificateModal.tsx、DNSCertificateModal.tsx、CustomCertificateModal.tsx 实现。下面逐一深入。HTTP Certificate面向公网域名的快速签发工作原理与前置条件HTTP 验证的核心是Lets Encrypt 服务器会**通过 HTTP而非 HTTPS**尝试访问你填写的域名如果访问成功并取回预期的验证文件就颁发证书。原文档明确指出该过程不支持通配符域名*.example.com无法用此方式签发。这意味着在申请证书之前你必须满足已为该域名创建Proxy Host且该 Proxy Host 可被公网以 HTTP 访问域名的 A/AAAA 记录已解析并指向这台运行 Nginx Proxy Manager 的服务器服务器 80 端口对外可达且没有被防火墙或 CDN 拦截。签发过程中后台发生了什么从源码 backend/internal/certificate.js 的create方法可以看出一次 HTTP 验证签发经历了完整的六步编排查出所有使用了这些域名的 HostgetHostsWithDomains临时禁用这些 Host 的 Nginx 配置disableInUseHosts生成 Lets Encrypt 请求配置generateLetsEncryptRequestConfig并 reload Nginx调用 certbot 签发requestLetsEncryptSsl删除临时 LE 配置并 reload恢复先前禁用的 HostenableInUseHosts。其中requestLetsEncryptSslcertificate.js#L777-L817实际拼装的 certbot 命令为certbot certonly -n \ --config /etc/letsencrypt.ini \ --work-dir /tmp/letsencrypt-lib \ --logs-dir /data/logs \ --cert-name npm-certificate_id \ --agree-tos -m email \ --authenticator webroot \ --preferred-challenges http \ --domains domain1,domain2关键参数含义--authenticator webroot使用 webroot 方式验证文件由 Nginx 从 ACME challenge 目录对外提供对应 letsencrypt-acme-challenge.conf 与模板 letsencrypt-request.conf--preferred-challenges http强制走 HTTP-01 挑战这正解释了必须保持 HTTP 可访问的硬性要求--cert-name npm-id证书以npm-id命名存储在/etc/letsencrypt/live/npm-id下见getLiveCertPathcertificate.js#L1262-L1264。签发成功后后端会调用openssl x509解析fullchain.pem的有效期回写数据库的expires_on字段certificate.js#L191-L199。为什么签发后 Proxy Host 仍需保留 HTTP原文档特别强调证书签发后你可以修改 Proxy Host 启用 HTTPS但该 Proxy Host 必须继续保留 HTTP 访问能力否则后续无法续期。因为每次续期仍会走 HTTP-01 挑战renewLetsEncryptSsl同样使用--preferred-challenges http见 certificate.js#L933-L968挑战路径依赖 80 端口对外服务。签发前的连通性自检TestHTTP 证书弹窗中提供 Test 按钮HTTPCertificateModal.tsx其底层调用POST /api/nginx/certificates/test-http。后端实现certificate.js#L1120-L1236会先在/data/letsencrypt-acme-challenge/.well-known/acme-challenge/test-challenge写入测试文件然后对每个域名发起一次外部探测返回结果含义如下返回状态含义处理建议ok域名可访问且返回了正确内容可以放心签发no-host域名无法解析或主机不可达检查 DNS 记录与 80 端口放行404主机存在但返回 404确认 Proxy Host 已创建且未禁用wrong-data返回了错误数据检查是否有其他服务占用该路径failed/other:code探测失败或异常状态码结合日志排查网络链路DNS Certificate支持通配符的验证方式工作原理与前置条件DNS 验证的核心是通过DNS Provider 插件在你的域名服务商处自动创建一条临时的 TXT 记录Lets Encrypt 查询该记录以证明你对域名的控制权验证通过后颁发证书。与原文档一致该方式有两个显著优势不需要预先创建 Proxy Host也不要求 Proxy Host 开放 HTTP 访问支持通配符域名如*.example.com只需填写*.example.com与example.com两个名称即可覆盖所有子域。因此它特别适合80/443 端口不可用的内网或受限环境、域名解析指向第三方 CDN/负载均衡、以及需要为大量子域统一签发通配符证书的场景。支持的 DNS Provider 与插件安装机制Nginx Proxy Manager 内置了 100 个 DNS Provider 的清单完整定义在 backend/certbot/dns-plugins.json包含 Cloudflare、Aliyun阿里云、DNSPod、Tencent Cloud腾讯云、Route 53、GoDaddy、DigitalOcean、CloudXNS、Hetzner、Vultr、OVH、Gandi、Namecheap 等国内外主流服务商。每个 Provider 条目声明了插件包名、版本、凭证模板credentials与 certbot 插件全名full_plugin_name例如cloudflare: { credentials: # Cloudflare API token\ndns_cloudflare_api_token0123456789abcdef0123456789abcdef01234567, dependencies: acme{{certbot-version}}, full_plugin_name: dns-cloudflare, name: Cloudflare, package_name: certbot-dns-cloudflare, version: {{certbot-version}} }当你选择某个 Provider 并提交证书申请时后端会先调用installPluginbackend/lib/certbot.js#L14-L51在 certbot 虚拟环境中按需安装对应插件. /opt/certbot/bin/activate pip install --no-cache-dir package_nameversion deactivate插件版本号中的{{certbot-version}}会被替换为当前容器的CERTBOT_VERSION环境变量值保证与 certbot 主版本兼容。签发与续期的实现细节DNS 签发的核心方法是requestLetsEncryptSslWithDnsChallengecertificate.js#L824-L889其拼装的 certbot 命令关键参数certbot certonly -n \ --config /etc/letsencrypt.ini \ --cert-name npm-id \ --agree-tos -m email \ --preferred-challenges dns \ --domains domains \ --authenticator dns_plugin_full_name \ --dns_plugin_full_name-credentials /etc/letsencrypt/credentials/credentials-id有几个值得注意的工程细节凭证落盘DNS 凭证被写入/etc/letsencrypt/credentials/credentials-id文件权限为0600仅属主可读写签发/续期失败或证书删除时会被清理certificate.js#L831-L833、certificate.js#L1046Route 53 特例AWS 插件不走--credentials参数而是通过设置AWS_CONFIG_FILE环境变量指向凭证文件getAdditionalCertbotArgscertificate.js#L1238-L1260DuckDNS 特例自动追加--dns-duckdns-no-txt-restore避免验证完成后恢复 TXT 记录传播等待可在表单中设置propagation_seconds0~7200对应 certbot 的--plugin-propagation-seconds用于等待 DNS 记录全球生效降低验证时记录未同步的失败率DNS 挑战无需 webroot 配置源码注释明确With DNS challenge no config is needed签发流程直接跳过 LE 临时配置的生成与删除步骤certificate.js#L152-L167。前端表单字段DNS 证书弹窗DNSCertificateModal.tsx默认提交meta.dnsChallenge: true并通过 DNSProviderFields.tsx 提供三个输入DNS Provider下拉选择数据来自GET /api/nginx/certificates/dns-providers见 certificates.js#L79-L108Credentials代码编辑器选中 Provider 后自动填充其credentials模板按模板替换为真实密钥即可Propagation SecondsDNS 传播等待秒数。需要说明的是凭证仅保存在容器内文件系统中后端 API 返回的证书对象会通过omissions()剔除meta.dns_provider_credentials字段certificate.js#L27-L29避免敏感信息泄露给前端。Custom Certificate导入自有 CA 证书适用场景如果你不使用 Lets Encrypt而是持有自有证书颁发机构CA签发的证书如企业内部 CA、商用证书就选择自定义证书方式上传你自己的 SSL 证书文件。原文档将其定义为由你自己的 CA 提供的证书。前端表单与三步保存流程自定义证书弹窗CustomCertificateModal.tsx包含以下输入字段是否必填说明Name名称必填证书显示名称1~255 字符Certificate Key必填私钥文件.keyCertificate必填证书文件.crt/.pemIntermediate Certificate可选中间证书/证书链文件其保存流程是先验证、再建记录、后上传三步CustomCertificateModal.tsx#L23-L57调用POST /api/nginx/certificates/validate校验三个文件是否合法以provider: other创建证书记录仅提交名称与 provider调用POST /api/nginx/certificates/id/upload上传文件内容后端完成落盘。后端验证与落盘细节文件白名单后端只接受certificate、certificate_key、intermediate_certificate三个字段allowedSslFilescertificate.js#L32其余字段一律忽略私钥校验checkPrivateKeycertificate.js#L632-L653将私钥写入临时文件后执行openssl pkey -in file -check -noout输出必须包含 key is valid10 秒超时机制用于识别带口令保护的私钥此类私钥不被接受证书信息解析getCertificateInfoFromFilecertificate.js#L681-L748通过openssl x509的-subject、-issuer、-dates参数解析出 CN公用名、签发者与有效期throw_expired模式下已过期证书会被直接拒绝落盘路径writeCustomCertcertificate.js#L487-L530将证书内容写入/data/custom_ssl/npm-id/fullchain.pem证书 中间证书按顺序拼接与privkey.pem该函数会明确拒绝为letsencrypt类型的证书写盘防止覆盖 LE 证书有效期回写上传成功后expires_on会根据解析出的notAfter日期更新同时domain_names会写入证书 CNcertificate.js#L614-L619。证书生命周期运维续期、下载、吊销与自动巡检自动续期机制Lets Encrypt 证书默认有效期 90 天Nginx Proxy Manager 内置了自动续期定时器certificate.js#L38-L110检查频率每1 小时执行一次intervalTimeout: 1000 * 60 * 60续期阈值到期前 30 天内renewBeforeExpirationBy: [30, days]的 LE 证书会被纳入续期队列串行执行所有到期证书逐个续期注释明确说明必须串行否则会触发 Another instance of Certbot is already running 错误失败容错单个证书续期失败只记录日志不阻断其他证书的处理。续期同样区分 HTTP/DNS 两种挑战方式renew方法根据meta.dns_challenge选择renewLetsEncryptSsl或renewLetsEncryptSslWithDnsChallengecertificate.js#L897-L927。你也可在证书列表的详情页手动点击 Renew 立即续期对应POST /api/nginx/certificates/id/renew。下载与吊销下载Lets Encrypt 证书可通过GET /api/nginx/certificates/id/download打包下载——后端会把/etc/letsencrypt/live/npm-id下所有.pem文件含 fullchain、privkey 等压缩为npm-id-时间戳.zipcertificate.js#L341-L365。自定义证书provider 为 other不可下载接口会返回校验错误吊销删除 Lets Encrypt 证书记录时后端会同步调用 certbotrevoke --cert-path ... --delete-after-revoke完成吊销并清理磁盘文件certificate.js#L1021-L1055删除采用软删除is_deleted: 1保留审计记录。证书使用情况与权限证书列表支持expand展开其关联的 Proxy Hosts、Redirection Hosts、Dead Hosts 与 StreamsallowGraph([owner,proxy_hosts,redirection_hosts,dead_hosts,streams])certificate.js#L296便于了解该证书被哪些站点引用数据模型定义见 backend/models/certificate.jsAPI 契约请求/响应示例见 backend/schema/components/certificate-object.json 与 backend/schema/paths/nginx/certificates/post.json权限模型创建证书需要certificates.manage权限当用户权限可见性非all时查询会强制限定owner_user_id为本用户certificate.js#L299-L301。关键元数据字段速查证书对象meta中与签发方式直接相关的字段定义于 backend/schema/components/certificate-object.json字段类型说明dns_challengeboolean是否使用 DNS 挑战trueDNS 验证falseHTTP 验证dns_providerstringDNS Provider 标识对应 dns-plugins.json 的 keydns_provider_credentialsstringDNS 插件凭证内容仅存储于后端不返回前端propagation_secondsinteger≥0DNS 传播等待秒数key_typersa/ecdsa默认 rsa证书密钥算法前端 HTTP/DNS 弹窗默认选择ecdsacertificate/certificate_key/intermediate_certificatestring自定义证书的证书、私钥与中间证书内容letsencrypt_certificateobjectLE 签发后回填的证书信息cn、issuer、dateskey_type会在 certbot 命令中追加--key-type rsa|ecdsacertificate.js#L805-L807若通过环境变量配置了自定义 ACME 服务器或 staging 模式getAdditionalCertbotArgs还会自动追加--server/--staging参数certificate.js#L1238-L1245可用于测试环境验证签发链路。常见问题与排查建议HTTP 验证一直失败优先在弹窗中点击 Test 查看每个域名的探测结果确认 Proxy Host 已创建、未被禁用、80 端口公网可达且域名解析正确。注意 HTTP 验证不支持通配符*.example.com必须改用 DNS 验证。DNS 验证报记录未找到增大 Propagation Seconds如 30~120 秒确认所选 Provider 与域名注册商一致且 API 凭证具备 DNS 记录增删权限。签发失败后列表出现无效证书后端在签发异常时会硬删除数据库记录certificate.js#L216-L220并在失败分支中恢复被临时禁用的 Host 与 Nginx 配置保证站点不受影响。邮箱缺失报错使用 Lets Encrypt 必须确保当前用户账号配置了有效邮箱后端会校验user.email并抛出A valid email address must be set on your user account to use Lets Encryptcertificate.js#L145-L150。自定义证书私钥带口令校验会超时并拒绝请先去除私钥口令再上传。通过以上三类证书方式与自动续期机制你可以为 Nginx Proxy Manager 管理的所有站点Proxy Host、Redirection Host、Dead Host、Stream灵活配置 TLS实现从内网自签到公网通配符的全场景覆盖。【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表