Nginx Proxy Manager证书管理全攻略:Let's Encrypt自动续期与多域名配置
【免费下载链接】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证书的步骤:
- 登录NPM管理界面,导航至SSL Certificates页面
- 点击Add SSL Certificate按钮,选择Let's Encrypt
- 填写证书信息:
- 邮箱地址(用于证书过期通知)
- 域名列表(支持多个域名,用逗号分隔)
- 同意Let's Encrypt服务条款
- 选择验证方式:
- HTTP-01:适合直接对外的Web服务
- DNS-01:适合无法直接访问的内部服务
技术细节:证书申请过程中,NPM会临时调整Nginx配置以完成域名验证,验证完成后自动恢复配置。相关逻辑见backend/internal/certificate.js
2. 多域名证书配置
NPM支持在单个证书中配置多个域名(SANs),实现一证多站:
- 在证书创建页面,域名输入框中填写多个域名,格式如下:
example.com,www.example.com,api.example.com - 系统会自动对域名进行排序并存储:
// 域名自动排序(确保一致性)
$beforeInsert () {
this.domain_names.sort();
},
$beforeUpdate () {
if (typeof this.domain_names !== 'undefined') {
this.domain_names.sort();
}
}
- 申请成功后,证书会显示为"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上传功能导入:
- 导航至SSL Certificates页面,点击Add SSL Certificate
- 选择Custom SSL Certificate
- 填写证书信息:
- 证书名称(便于识别)
- 证书内容(公钥)
- 私钥内容
- 中间证书(可选)
- 点击保存,系统会验证证书有效性并存储
验证逻辑见backend/internal/certificate.js,通过OpenSSL命令验证证书链完整性
常见问题解决
问题1:证书申请失败,提示"无法验证域名"
可能原因:
- 域名解析未指向NPM服务器IP
- 防火墙阻止了80/443端口访问
- 已存在同名证书
解决方案:
- 确认域名A记录指向正确的服务器IP
- 检查防火墙规则,确保允许80/443端口入站流量
- 删除冲突证书后重试:
// 证书删除逻辑
delete: (access, data) => {
return certificateModel
.query()
.where('id', row.id)
.patch({
is_deleted: 1
})
.then(() => {
// 撤销证书
return internalCertificate.revokeLetsEncryptSsl(row);
});
}
问题2:证书续期失败
可能原因:
- 服务器网络问题,无法连接Let's Encrypt服务器
- 域名解析已更改
- 证书文件权限问题
解决方案:
- 手动触发续期:在证书列表页点击"Renew Now"
- 检查NPM日志定位具体错误:
docker logs nginx-proxy-manager | grep certbot - 确认服务器可访问以下Let's Encrypt域名:
- acme-v02.api.letsencrypt.org
- staging-v02.api.letsencrypt.org
高级配置技巧
1. DNS-01验证配置
对于无法通过HTTP验证的场景(如端口映射环境),可使用DNS-01验证:
- 在证书创建页面选择DNS Challenge
- 根据提示在域名DNS解析中添加TXT记录
- 点击"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});
});
}
操作步骤:
- 在证书列表中找到目标证书
- 点击"Download"按钮
- 保存生成的ZIP文件,包含以下证书文件:
- fullchain.pem(完整证书链)
- privkey.pem(私钥)
- cert.pem(服务器证书)
- chain.pem(中间证书)
总结与最佳实践
通过NPM管理SSL证书,你可以实现:
- 一劳永逸:设置完成后全程自动管理,无需人工干预
- 安全可靠:遵循Let's Encrypt最佳实践,确保证书安全
- 灵活扩展:支持各类场景,从简单网站到复杂微服务架构
建议定期检查证书状态,可通过NPM审计日志跟踪证书操作记录,确保所有域名都受到有效保护。
掌握这些技巧后,你将彻底告别证书过期的烦恼,让网站始终保持安全的HTTPS访问状态。
【免费下载链接】nginx-proxy-manager 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-proxy-manager
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



