Postfix配置:为每个托管的虚拟邮件域配置不同的TLS证书
Postfix配置:为每个托管的虚拟邮件域配置不同的TLS证书
当然可以!Postfix从2.11版本开始就支持SMTP服务器端的SNI(Server Name Indication),刚好能实现你想要的、类似Apache虚拟主机的TLS证书按需切换功能。下面结合你的现有环境,一步步教你配置:
前提条件确认
首先得确保你的Postfix版本≥2.11,只有这个版本及以上才支持SMTP服务器端的SNI。执行以下命令查看版本:
postconf -d | grep mail_version
1. 整理证书文件
先把每个域名的证书和私钥准备妥当:
- 每个域名需要完整的证书链文件(包含服务器证书+所有中间证书,顺序是服务器证书在前,中间证书在后),以及对应的无密码保护的私钥文件(如果私钥有密码,Postfix启动时会卡住,无法自动运行)。
- 把证书文件统一放在Postfix能访问的目录,比如
/etc/postfix/certs/,并设置正确的权限,让Postfix用户(通常是postfix)能读取:
chmod 640 /etc/postfix/certs/*.pem chown root:postfix /etc/postfix/certs/*.pem
对应你的域名:
mail.my-1st-domain.tld:证书链my-cert-chain-for-1st-domain.pem、私钥my-key-for-1st-domain.pemmail.my-2nd-domain.tld:证书链my-cert-chain-for-2nd-domain.pem、私钥my-key-for-2nd-domain.pem
2. 创建SNI映射表
创建一个映射文件,用来把客户端请求的域名和对应的证书/私钥关联起来。比如创建/etc/postfix/sni_map,内容如下:
mail.my-1st-domain.tld /etc/postfix/certs/my-cert-chain-for-1st-domain.pem /etc/postfix/certs/my-key-for-1st-domain.pem mail.my-2nd-domain.tld /etc/postfix/certs/my-cert-chain-for-2nd-domain.pem /etc/postfix/certs/my-key-for-2nd-domain.pem
然后生成Postfix能识别的哈希表:
postmap /etc/postfix/sni_map
3. 修改Postfix主配置(main.cf)
编辑/etc/postfix/main.cf,添加或调整以下配置:
- 设置默认TLS证书(给不支持SNI的老客户端使用,如果你没有单独的默认证书,也可以用其中一个域名的证书代替):
smtpd_tls_cert_file = /etc/postfix/certs/default-cert.pem smtpd_tls_key_file = /etc/postfix/certs/default-key.pem
- 启用SNI映射:
smtpd_tls_server_sni_maps = hash:/etc/postfix/sni_map
- 确保TLS功能已经开启(如果之前没配置过):
smtpd_use_tls = yes smtpd_tls_security_level = may
4. 重启Postfix生效
根据你的操作系统,执行对应的重启命令:
# 适用于systemd系统(如Ubuntu 16.04+、CentOS 7+) systemctl restart postfix # 适用于sysvinit系统 service postfix restart
验证配置是否成功
用openssl命令分别测试两个域名的证书加载情况:
测试第一个域名:
openssl s_client -connect 203.0.113.1:25 -servername mail.my-1st-domain.tld -starttls smtp
在输出中查找Subject:字段,确认证书属于mail.my-1st-domain.tld。
测试第二个域名:
openssl s_client -connect 203.0.113.1:25 -servername mail.my-2nd-domain.tld -starttls smtp
同样确认证书对应正确的域名。
注意事项
- 证书必须包含对应的域名(比如
mail.my-1st-domain.tld)作为Subject Alternative Name (SAN) 或者Common Name (CN),否则客户端会提示证书不匹配。 - 映射表中的域名要和客户端发起SNI请求的域名完全一致(大小写敏感,建议统一用小写)。
- 如果你的Postfix版本低于2.11,需要先升级到支持SNI的版本,否则无法实现这个功能。
备注:内容来源于stack exchange,提问作者user2690527
相关产品推荐
相关产品推荐

