如何配置Nginx Proxy Manager为后端modoboa邮件服务器托管SSL证书?
下面提供三种可行的优化方案,从快速落地到彻底根治,你可以根据自身环境选择:
方案一:自动证书同步脚本(快速替代手动操作)
既然已经在手动复制证书,直接把这个流程自动化,避免遗忘续订后的同步操作。
操作步骤:
在Nginx Proxy Manager(以下简称NPM)服务器配置免密SSH登录到Modoboa服务器,让脚本能自动传输文件:
# 在NPM服务器生成SSH密钥(一路回车即可) ssh-keygen -t ed25519 # 将公钥复制到Modoboa服务器(替换为你的邮件服务器IP和登录用户名) ssh-copy-id your-modoboa-user@modoboa-server-ip在NPM服务器编写同步脚本
sync-mail-cert.sh:#!/bin/bash # NPM中Let's Encrypt证书的存放路径(默认路径,可根据NPM版本调整) LOCAL_CERT_DIR="/data/nginx-proxy-manager/letsencrypt/live/your-mail-domain.com" # Modoboa服务器中证书的目标存放路径(根据你的Modoboa nginx配置调整) REMOTE_CERT_DIR="/etc/nginx/ssl/" # Modoboa服务器的登录信息 REMOTE_USER="your-modoboa-user" REMOTE_HOST="modoboa-server-ip" # 同步证书文件 rsync -avz $LOCAL_CERT_DIR/fullchain.pem $REMOTE_USER@$REMOTE_HOST:$REMOTE_CERT_DIR/mail-domain.crt rsync -avz $LOCAL_CERT_DIR/privkey.pem $REMOTE_USER@$REMOTE_HOST:$REMOTE_CERT_DIR/mail-domain.key # 远程重启Modoboa的nginx服务,加载新证书 ssh $REMOTE_USER@$REMOTE_HOST "sudo systemctl reload nginx"给脚本添加执行权限:
chmod +x sync-mail-cert.sh设置定时任务,每周执行一次(Let's Encrypt证书有效期90天,提前更新更稳妥):
crontab -e # 添加一行:每周日凌晨2点执行同步,输出日志到指定文件 0 2 * * 0 /path/to/sync-mail-cert.sh >> /var/log/mail-cert-sync.log 2>&1额外优化:部分版本的NPM支持证书续订后触发钩子脚本,可直接将这个同步脚本配置到钩子中,实现证书更新后自动同步,不用依赖定时任务。
方案二:用NPM直接代理邮件协议(推荐,彻底摆脱后端证书)
邮件协议(SMTP/IMAP/POP3)可通过Nginx的stream模块直接代理,让NPM处理所有SSL握手,后端Modoboa的nginx无需配置SSL,直接用内网明文通信(安全可控)。
操作步骤:
在NPM后台添加TCP/UDP代理(部分版本叫Stream代理):
- SMTP协议:
- 监听端口:465(SSL)、587(STARTTLS)、25(可选明文端口)
- 转发目标:Modoboa服务器的对应明文端口(比如把465转发到Modoboa的2525端口,后端不配置SSL)
- 启用SSL,选择你的邮件域名证书
- IMAP/POP3协议:
- 监听端口:993(IMAP SSL)、995(POP3 SSL)
- 转发目标:Modoboa服务器的明文端口(IMAP用143,POP3用110,后端不配置SSL)
- 启用SSL,选择同一个邮件域名证书
- SMTP协议:
修改Modoboa的nginx配置,移除所有SSL相关配置,改为监听明文端口:
以IMAP为例:server { listen 143; server_name mail.yourdomain.com; # 保留其他Modoboa的IMAP代理配置 proxy_pass imap://127.0.0.1:143; }以SMTP为例:
server { listen 2525; server_name mail.yourdomain.com; # 保留其他Modoboa的SMTP代理配置 proxy_pass smtp://127.0.0.1:25; }重启Modoboa的nginx和NPM服务,测试邮件客户端连接——所有SSL握手在NPM完成,后端无需管理证书。
方案三:共享证书目录(适合有存储服务器的环境)
用NFS或SMB将NPM的证书目录共享给Modoboa服务器,让Modoboa直接读取NPM的证书文件,无需复制。
操作步骤:
在NPM服务器配置NFS共享:
# Debian/Ubuntu系统安装NFS服务 apt install nfs-kernel-server # 编辑共享配置文件 echo "/data/nginx-proxy-manager/letsencrypt/live modoboa-server-ip(rw,sync,no_root_squash)" >> /etc/exports # 重启NFS服务 systemctl restart nfs-kernel-server在Modoboa服务器挂载NFS目录:
# Debian/Ubuntu系统安装NFS客户端 apt install nfs-common # 创建挂载点 mkdir -p /etc/nginx/ssl/npm-shared # 挂载NFS目录 mount -t nfs npm-server-ip:/data/nginx-proxy-manager/letsencrypt/live /etc/nginx/ssl/npm-shared # 设置开机自动挂载,编辑/etc/fstab echo "npm-server-ip:/data/nginx-proxy-manager/letsencrypt/live /etc/nginx/ssl/npm-shared nfs defaults 0 0" >> /etc/fstab修改Modoboa的nginx配置,证书路径指向挂载的共享目录:
ssl_certificate /etc/nginx/ssl/npm-shared/your-mail-domain.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/npm-shared/your-mail-domain.com/privkey.pem;重启Modoboa的nginx服务,证书更新后,可配合方案一的脚本重载nginx加载新证书。
内容的提问来源于stack exchange,提问作者cyberneko2020

