如何在 Nginx 代理管理器服务器后面配置带有 SSL 的邮件服务器?

问题描述 投票:0回答:2

我在各种面向 Web 的服务器和邮件服务器 (modoboa) 前面有一个 Nginx 代理管理器服务器。我面临的问题是我的邮件服务器需要本地 nginx 配置的 ssl_certificate 。如果另一个服务有一些面向 Web 的门户,我可以在所述服务器上使用端口 80 定义一个简单的服务器上下文,并使用 Nginx 代理管理器来处理 Let's Encrypt 证书和 443 代理。目前,我对邮件服务器的解决方法是在 Nginx 代理管理器服务器上生成 SSL 证书,然后手动将它们复制到邮件服务器的 nginx 配置定义的适当位置。这有几个缺点,其中最重要的是这些证书的有效期相当短,需要更新,然后需要重新复制它们(并记住这样做!)。

我确信这是一个很容易解决的问题。我只是希望我的 Nginx 代理管理器成为唯一的 SSL 存储库,并让上游服务器(例如我的邮件服务器)在其中查找 SSL 证书。然而,我进行了广泛的搜索,由于诸如 nginx 的流之类的限制,这对于邮件应用程序来说似乎特别具有挑战性。希望这里有人能给我指点一个简单的指南来改善我的网络。

Network flow

以上是我目前的配置。我已经尝试了 nginx 中的各种代理和邮件上下文设置,但尚未找到任何下游 SSL 问题的解决方案。

如果我的上游/下游术语颠倒了,我深表歉意。

proxy ssl-certificate nginx-reverse-proxy lets-encrypt mail-server
2个回答
0
投票

我也有同样的设置。我在单独的服务器上设置了 iRedmail,并使用 NPM 作为所有服务器的代理。我将 sIMAP(587 后)和 sSMTP(端口 143)流量直接从路由器重定向到 iRedMail 服务器。所有其他流量都通过 NPM。

所有证书均由 NPM Lets_Encrypt 设施处理。 我通过这种方式将特定证书从 NPM 移动到 iRedMail:

我通过在 IredMail 服务器上生成 ssh 证书,在 NPM 服务器上创建了基于 ssh 证书的登录:

ssh-keygen

将公共部分复制到NPM:

ssh-copy-id <username>@NPM-host

现在 iRedMail 上的 root 帐户可以通过脚本 ssh 到 NPM 和 fecth 文件

在 NPM 上创建一个脚本,从 /etc/letsencrypt/live/NPM-/ 目录中复制正确的 Lets-Encrypt 文件

#!/bin/bash
cp /etc/letsencrypt/live/npm-xx/fullchain.pem /home/<privuser>/domainename/.
cp /etc/letsencrypt/live/npm-xx/privkey.pem /home/<privuser>/domainename/.
cp /etc/letsencrypt/live/npm-xx/chain.pem /home/<privuser>/domainename/.
cp /etc/letsencrypt/live/npm-xx/cert.pem /home/<privuser>/domainename/.

chmod 644 /home/<privuser>/domainename/*.pem

使用 crontab -e 将其放入“root”的 crontab 文件中,因为只有 root 可以访问和复制所有的 Lets-Encrypt 文件

在 iRedMail 主机上修改 root 的 crontab,以便停止运行 LetsEncrypt cron 作业,并将现有的 LetsEncrypt 文件替换为 我们要从 NPM 主机复制的内容,例如

#stop renewal of lets-encrypt on the mailserver
#1   7   *   *   *   certbot renew --post-hook '/usr/sbin/service postfix restart; /usr/sbin/service nginx restart; /usr/sbin/service d>
    
#Fetch the lets-encrypt files from NPM server
 10 11 * * * rsync -avz -e ssh <privuser@<hostIP>:/home/<privuser>/domainname/*.pem <domainname>/.

#copy the fetched files to the correct locations
11 11 * * * cp /root/<domainname>/fullchain.pem /etc/letsencrypt/archive/<domainname>/fullchain1.pem
11 11 * * * cp /root/<domainname>/privkey.pem /etc/letsencrypt/archive/<domainname>/privkey1.pem
11 11 * * * cp /root/<domainname>/cert.pem /etc/letsencrypt/archive/<domainname>/cert1.pem
11 11 * * * cp /root/<domainname>/chain.pem /etc/letsencrypt/archive/<domainname>/chain1.pem

现在您在邮件(或其他)服务器上拥有 NPM 让加密证书。


0
投票

抱歉,我无法发表评论来回答@cyberneko2020 的问题,而且我不是原始答案的作者。但我可以澄清是否有人需要它。

首先,这个 crontab 条目似乎被您的终端 c&p 截断了,您能发布整个内容吗?我想这是一个鸽舍重新启动,但不确定您是否要重新启动更多:#1 7 * * * certbot renew --post-hook '/usr/sbin/service postfix restart; /usr/sbin/service nginx重启; /usr/sbin/service d> 另外,我想根据你的解释,它不应该被注释掉,所以这可能是一个错误的哈希标记。

这不是一个错误 - @Jens-k 正在禁用现有的 crontab 条目,即 iRedmail 的内置证书更新。所以这并不是终端截断的重点。应注释以

certbot
开头的行,因为我们正在用自定义证书复制过程替换此机制。

其次,你的iRedMail服务器是否没有以root身份连接到你的nginxpm?我认为这就是不直接访问证书的原因。

正确,@Jens-k 没有通过 SSH 以 root 身份登录到 nginxpm 服务器。为此,他们在 nginxpm 服务器上创建了一个单独的用户帐户

<privuser>
。从安全角度来看,这是一个很好的方法。

您还需要将从 nginxpm 复制证书到

<privuser>
用户目录的代码放入 nginxpm 服务器上的脚本中,比如说
/root/copycerts.sh

#!/bin/bash
cp /etc/letsencrypt/live/npm-xx/fullchain.pem /home/<privuser>/domainename/.
cp /etc/letsencrypt/live/npm-xx/privkey.pem /home/<privuser>/domainename/.
cp /etc/letsencrypt/live/npm-xx/chain.pem /home/<privuser>/domainename/.
cp /etc/letsencrypt/live/npm-xx/cert.pem /home/<privuser>/domainename/.

chmod 644 /home/<privuser>/domainename/*.pem

然后使脚本文件对root可执行,而其他人无法访问

chmod 700 /root/copycerts.sh

最后,在 nginxpm 服务器上的 root crontab 中添加一个条目

# Run the script to copy letsencrypt certificates to user's directory for further distribution  
9 11 * * * /root/copycerts.sh
© www.soinside.com 2019 - 2024. All rights reserved.