世界再美我始终如一 2025-11-25 14:50 采纳率: 98.7%
浏览 4
已采纳

如何在Nginx Proxy Manager中为多个域名配置Let's Encrypt证书?

在使用Nginx Proxy Manager配置多个域名的Let's Encrypt证书时,常见问题是:当为多个域名(如example.com和api.example.com)在同一代理主机中申请SSL证书时,系统仅对主域名签发证书,子域名未被包含,导致部分域名出现SSL警告。如何正确配置多域名(包括主域和子域)在同一个Let's Encrypt证书中?是否需要启用通配符证书?若使用DNS验证,应如何集成Cloudflare等第三方DNS服务商?此外,证书自动续期失败时应检查哪些日志与设置?
  • 写回答

1条回答 默认 最新

  • 时维教育顾老师 2025-11-25 14:55
    关注

    一、Nginx Proxy Manager中多域名Let's Encrypt证书配置深度解析

    1. 问题背景与常见现象分析

    在使用Nginx Proxy Manager(NPM)部署多个域名服务时,开发者常遇到SSL证书仅对主域名生效的问题。例如:为example.comapi.example.com创建代理主机时,系统默认只将主域名example.com提交至Let's Encrypt进行签发,子域名未被包含在SAN(Subject Alternative Name)字段中,导致访问api.example.com时浏览器提示“您的连接不是私密连接”。

    该问题的根本原因在于NPM的SSL证书申请逻辑依赖于代理主机配置中的“域名”输入框内容。若未显式添加所有需要保护的域名,则ACME协议只会为主域名请求证书。

    2. 多域名证书配置方法详解

    要确保多个域名(包括主域与子域)共用一张有效的Let's Encrypt证书,必须在创建或编辑代理主机时正确填写域名字段:

    • 步骤1:进入Nginx Proxy Manager管理界面 → “Hosts” → “Proxy Hosts” → 点击“Add Proxy Host”
    • 步骤2:在“Domain Names”输入框中,逐行输入所有需保护的域名,如:
    example.com
    www.example.com
    api.example.com
    admin.example.com
        

    注意:每个域名占一行,NPM会自动将其作为SAN条目提交给Let's Encrypt。

    这样生成的证书将包含全部列出的域名,避免SSL警告。

    3. 是否需要启用通配符证书?场景对比分析

    需求类型适用方案优点缺点验证方式要求
    固定几个子域多域名证书(SAN)简单、兼容性好无法覆盖未来新增子域HTTP或DNS均可
    大量动态子域通配符证书(*.example.com)一次签发,支持无限子域必须使用DNS验证DNS验证(如Cloudflare API)

    结论:对于少量明确的子域名,推荐使用多域名SAN证书;若存在频繁新增子域的需求(如SaaS平台),则应采用通配符证书。

    4. DNS验证集成Cloudflare实现通配符证书签发

    当选择通配符证书时,Let's Encrypt要求通过DNS-01挑战验证域名所有权。Nginx Proxy Manager本身不直接支持DNS插件,但可通过反向工程其底层ACME客户端(acme.sh或certbot)结合外部脚本实现。

    以下是基于acme.sh + Cloudflare API的集成流程:

    1. 获取Cloudflare Global API Key或API Token(建议最小权限原则)
    2. 在服务器上安装acme.sh:
      curl https://get.acme.sh | sh
    3. 设置环境变量以供DNS调用:
      export CF_Token="your_api_token"
      export CF_Account_ID="your_account_id"
    4. 申请通配符证书:
      acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'
    5. 导出证书并手动配置到NPM指定路径(/data/ssl/custom/...)
    6. 在NPM中选择“Use Custom SSL Certificate”绑定已签发证书

    5. 自动续期失败排查清单

    Let's Encrypt证书有效期为90天,自动续期机制至关重要。当续期失败时,应按以下顺序检查:

    • 检查NPM日志输出:
      查看容器日志:docker logs nginx-proxy-manager,搜索关键词“Let's Encrypt”、“error”、“failed”
    • 确认域名解析状态:确保所有域名仍正确指向当前服务器IP
    • 验证HTTP-01可达性:从外网访问http://your-domain/.well-known/acme-challenge/是否可读
    • DNS记录有效性:若使用DNS验证,确认TXT记录已成功发布且TTL已过期
    • API凭据时效性:Cloudflare等服务商的Token可能过期或权限变更
    • 速率限制:Let's Encrypt对同一域名每周最多允许5次失败重试
    • 存储卷权限:确保证书目录(如/data/letsencrypt)具有写入权限
    • NPM版本兼容性:旧版本可能存在ACMEv2协议支持缺陷,建议升级至最新稳定版

    6. 架构级优化建议与监控策略

    为提升生产环境稳定性,建议实施如下架构实践:

    graph TD A[用户请求] --> B{域名判断} B -->|主站流量| C[example.com] B -->|API流量| D[api.example.com] B -->|管理后台| E[admin.example.com] C --> F[Nginx Proxy Manager] D --> F E --> F F --> G[ACME客户端触发证书申请] G --> H{验证方式} H -->|HTTP-01| I[开放80端口响应挑战] H -->|DNS-01| J[调用Cloudflare API写入TXT] J --> K[成功获取多域名/Wildcard证书] K --> L[自动部署至NPM] L --> M[定期健康检查与告警]

    通过上述流程图可见,完整的证书生命周期管理应嵌入CI/CD与监控体系中。推荐使用Prometheus + Alertmanager监控证书剩余有效期,并通过Webhook通知运维团队。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月26日
  • 创建了问题 11月25日