Nginx Proxy Manager证书管理全攻略:Let's Encrypt自动续期与多域名配置

Nginx Proxy Manager证书管理全攻略:Let's Encrypt自动续期与多域名配置

【免费下载链接】nginx-proxy-manager 【免费下载链接】nginx-proxy-manager 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-proxy-manager

你是否还在为SSL证书过期导致网站访问异常而烦恼?是否在管理多个域名证书时感到手忙脚乱?本文将带你一文掌握Nginx Proxy Manager(以下简称NPM)的证书管理核心功能,从Let's Encrypt证书自动签发到多域名配置,再到无缝续期,让你彻底摆脱证书管理的痛点。

核心功能概览

NPM的证书管理模块基于backend/internal/certificate.js实现,核心功能包括:

  • 自动化证书生命周期管理:从申请、部署到续期全程无需人工干预
  • 多域名支持:单证书保护多个域名(SANs)
  • 双验证方式:HTTP-01与DNS-01挑战验证
  • 证书存储:安全存储Let's Encrypt证书及自定义SSL证书
  • 过期预警:提前30天自动检测并续期即将过期证书

证书工作原理

NPM的证书自动续期机制由定时器驱动,每小时检查一次证书状态:

// 自动续期定时器初始化
initTimer: () => {
  logger.info('Let\'s Encrypt Renewal Timer initialized');
  internalCertificate.interval = setInterval(internalCertificate.processExpiringHosts, internalCertificate.intervalTimeout);
  internalCertificate.processExpiringHosts();
}

当证书有效期小于30天时,系统会自动触发续期流程:

// 续期阈值设置(30天)
renewBeforeExpirationBy: [30, 'days'],

// 证书过期检查逻辑
processExpiringHosts: () => {
  const expirationThreshold = moment().add(30, 'days').format('YYYY-MM-DD HH:mm:ss');
  // 查询30天内过期的证书
  certificateModel
    .query()
    .where('is_deleted', 0)
    .andWhere('provider', 'letsencrypt')
    .andWhere('expires_on', '<', expirationThreshold)
    // 执行续期操作
}

实战操作指南

1. Let's Encrypt证书申请

通过NPM界面申请Let's Encrypt证书的步骤:

  1. 登录NPM管理界面,导航至SSL Certificates页面
  2. 点击Add SSL Certificate按钮,选择Let's Encrypt
  3. 填写证书信息:
    • 邮箱地址(用于证书过期通知)
    • 域名列表(支持多个域名,用逗号分隔)
    • 同意Let's Encrypt服务条款
  4. 选择验证方式:
    • HTTP-01:适合直接对外的Web服务
    • DNS-01:适合无法直接访问的内部服务

技术细节:证书申请过程中,NPM会临时调整Nginx配置以完成域名验证,验证完成后自动恢复配置。相关逻辑见backend/internal/certificate.js

2. 多域名证书配置

NPM支持在单个证书中配置多个域名(SANs),实现一证多站:

  1. 在证书创建页面,域名输入框中填写多个域名,格式如下:
    example.com,www.example.com,api.example.com
    
  2. 系统会自动对域名进行排序并存储:
// 域名自动排序(确保一致性)
$beforeInsert () {
  this.domain_names.sort();
},
$beforeUpdate () {
  if (typeof this.domain_names !== 'undefined') {
    this.domain_names.sort();
  }
}
  1. 申请成功后,证书会显示为"example.com, www.example.com, api.example.com"

3. 证书自动续期配置

NPM默认启用自动续期功能,无需额外配置。核心续期参数可在代码中调整:

// 续期检查间隔(1小时)
intervalTimeout: 1000 * 60 * 60,

// 提前续期时间(30天)
renewBeforeExpirationBy: [30, 'days'],

如需修改这些参数,可编辑backend/internal/certificate.js文件,调整对应数值后重启NPM服务。

4. 自定义SSL证书上传

对于已有SSL证书,可通过NPM上传功能导入:

  1. 导航至SSL Certificates页面,点击Add SSL Certificate
  2. 选择Custom SSL Certificate
  3. 填写证书信息:
    • 证书名称(便于识别)
    • 证书内容(公钥)
    • 私钥内容
    • 中间证书(可选)
  4. 点击保存,系统会验证证书有效性并存储

验证逻辑见backend/internal/certificate.js,通过OpenSSL命令验证证书链完整性

常见问题解决

问题1:证书申请失败,提示"无法验证域名"

可能原因

  • 域名解析未指向NPM服务器IP
  • 防火墙阻止了80/443端口访问
  • 已存在同名证书

解决方案

  1. 确认域名A记录指向正确的服务器IP
  2. 检查防火墙规则,确保允许80/443端口入站流量
  3. 删除冲突证书后重试:
// 证书删除逻辑
delete: (access, data) => {
  return certificateModel
    .query()
    .where('id', row.id)
    .patch({
      is_deleted: 1
    })
    .then(() => {
      // 撤销证书
      return internalCertificate.revokeLetsEncryptSsl(row);
    });
}

问题2:证书续期失败

可能原因

  • 服务器网络问题,无法连接Let's Encrypt服务器
  • 域名解析已更改
  • 证书文件权限问题

解决方案

  1. 手动触发续期:在证书列表页点击"Renew Now"
  2. 检查NPM日志定位具体错误:
    docker logs nginx-proxy-manager | grep certbot
    
  3. 确认服务器可访问以下Let's Encrypt域名:
    • acme-v02.api.letsencrypt.org
    • staging-v02.api.letsencrypt.org

高级配置技巧

1. DNS-01验证配置

对于无法通过HTTP验证的场景(如端口映射环境),可使用DNS-01验证:

  1. 在证书创建页面选择DNS Challenge
  2. 根据提示在域名DNS解析中添加TXT记录
  3. 点击"Verify DNS Records"完成验证

技术细节:DNS-01验证通过backend/lib/certbot.js实现,支持多种DNS插件,可通过global/certbot-dns-plugins.json配置

2. 证书导出与备份

NPM支持将Let's Encrypt证书导出备份:

// 证书导出功能实现
download: (access, data) => {
  const zipDirectory = '/etc/letsencrypt/live/npm-' + data.id;
  // 将证书文件打包为ZIP
  internalCertificate.zipFiles(certFiles, opName)
    .then(() => {
      resolve({fileName: opName});
    });
}

操作步骤:

  1. 在证书列表中找到目标证书
  2. 点击"Download"按钮
  3. 保存生成的ZIP文件,包含以下证书文件:
    • fullchain.pem(完整证书链)
    • privkey.pem(私钥)
    • cert.pem(服务器证书)
    • chain.pem(中间证书)

总结与最佳实践

通过NPM管理SSL证书,你可以实现:

  • 一劳永逸:设置完成后全程自动管理,无需人工干预
  • 安全可靠:遵循Let's Encrypt最佳实践,确保证书安全
  • 灵活扩展:支持各类场景,从简单网站到复杂微服务架构

建议定期检查证书状态,可通过NPM审计日志跟踪证书操作记录,确保所有域名都受到有效保护。

掌握这些技巧后,你将彻底告别证书过期的烦恼,让网站始终保持安全的HTTPS访问状态。

【免费下载链接】nginx-proxy-manager 【免费下载链接】nginx-proxy-manager 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-proxy-manager

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值