在 Postfix 和 Dovecot 中为多个域设置证书

在 Postfix 和 Dovecot 中为多个域设置证书

我不知道如何设置 main.conf postfix 配置文件和 10-ssl.conf dovecot 配置文件,以使我的邮件服务器能够处理多个证书。让我解释一下……我在同一台服务器上有两个域,比如

  • mail.example.it
  • mail.example.com

并在不同的文件夹中有两个不同的证书

  • etc/letsencrypt/live/mail.example.it
  • etc/letsencrypt/live/mail.example.com

问题是我应该如何在 postfix 配置的 main.conf 上设置 tls 参数?它似乎只支持一个条目

  • smtpd_tls_cert_file
  • smtpd_tls_key_file

dovecot 配置的 10-ssl.conf 上也存在同样的问题:似乎只支持一个条目

  • ssl_cert
  • ssl_key

非常感谢帮助

答案1

这是通过查看服务器名称指示 (SNI)在 TLS 握手过程中使用 header 来选择正确的证书,然后再交换任何加密数据。目前(如果有变化,我会编辑此答案)

更新:Postfix 3.4.0 中引入了 SNI 支持 -http://www.postfix.org/announcements/postfix-3.4.0.html

另一方面,Dovecot 却有。请参阅此示例配置:

# Default
ssl_cert = </path/to/default/cert
ssl_key = </path/to/default/private/key

# mail.example.it
local_name mail.example.it {
    ssl_cert = </etc/letsencrypt/live/mail.example.it
    ssl_key = </path/to/mail.example.it/private/key
}

# mail.example.com
local_name mail.example.com {
    ssl_cert = </etc/letsencrypt/live/mail.example.com
    ssl_key = </path/to/mail.example.com/private/key
}

ssl_key如果与默认域相同,则可以省略每个域。

答案2

据我所知,这是不可能的。你有两个选择:

  • 使用一个域作为服务器应处理的所有其他域的 MX。因此,如果您已为 配置了证书,example.com并且还想处理 的邮件example.org,请在区域中设置指向您的example.com服务器的 MX 条目example.org
  • 对您需要的每个域使用具有多个 SAN 的证书。这意味着您只有一个涵盖所有域的证书文件。

答案3

Postfix 3.4 及更高版本现在允许 SNI 映射处理不同域/子域的多个证书:

http://www.postfix.org/postconf.5.html#tls_server_sni_maps

关于使用 Let's Encrypt 正确配置的提示:

http://postfix.1071664.n5.nabble.com/如何使用新服务器-TLS-SNI-feature-3-4-x-td100786.html#a100819

总结一下,用户@MKPostfix 邮件列表说(以防上述链接由于某种原因失效):

----- main.cf -----
# provide the primary certificate for the server, to be used for outgoing connections
smtpd_tls_chain_files =
 /etc/letsencrypt/live/servername.serverdom.com/privkey.pem,
 /etc/letsencrypt/live/servername.serverdom.com/fullchain.pem

# provide the map to be used when SNI support is enabled
tls_server_sni_maps = hash:/etc/postfix/vmail_ssl.map
-----
----- /etc/postfix/vmail_ssl.map -----
# Compile with postmap -F hash:/etc/postfix/vmail_ssl.map when updating
# One host per line
servername.serverdom.com 
 /etc/letsencrypt/live/servername.serverdom.com/privkey.pem 
 /etc/letsencrypt/live/servername.serverdom.com/fullchain.pem
servername.otherdom.com 
 /etc/letsencrypt/live/servername.otherdom.com/privkey.pem 
 /etc/letsencrypt/live/servername.otherdom.com/fullchain.pem
-----

然后运行

$ postmap -F hash:/etc/postfix/vmail_ssl.map

postfix正常重启。

跑步

$ openssl s_client -connect localhost:25 -servername servername.otherdom.com -starttls smtp

$ openssl s_client -connect localhost:25 -servername servername.serverdom.com -starttls smtp

测试:您将在证书详细信息下找到主机名。如果不匹配,它将匹配主机的默认服务器名称。因此,请确保主机的服务器名称在映射文件中。

笔记:我自己还没有测试过,我只是想寻找一些提示如何去做这件事,偶然发现了这个 SF 线程......

答案4

虽然 @Billy 给出了对我来说有用的解决方案Dovecot,但这两篇帖子对我帮助很大PostfixPostfix 和多个 SSL 证书, 和在 postfix 中使用多个“myhostname”

相关内容