我正在尝试使用SSL将Dovecot设置为具有多个虚拟主机。

我已经设置了我的主域(example.de),而对于我的虚拟主机(example2.com&example3.co.uk),我正在使用local -option。

我的问题:



如何使dovecot为每个主机使用正确的证书?

这是我的鸽舍配置:

listen = *
ssl = yes
protocols = imap pop3
disable_plaintext_auth = no
auth_mechanisms = plain login
mail_access_groups = vmail
default_login_user = vmail
first_valid_uid = 2222
first_valid_gid = 2222
#mail_location = maildir:~/Maildir
mail_location = maildir:/home/vmail/%d/%n

passdb {
    driver = passwd-file
    args = scheme=SHA1 /etc/dovecot/passwd
}
userdb {
    driver = static
    args = uid=2222 gid=2222 home=/home/vmail/%d/%n allow_all_users=yes
}
service auth {
    unix_listener auth-client {
        group = postfix
        mode = 0660
        user = root
    }
    user = root
}
service imap-login {
  process_min_avail = 1
  user = vmail
}

ssl_cert = </etc/pki/tls/certs/example.de.crt
ssl_key = </etc/pki/tls/private/example.de.key

local ohmygodpresents.com {
  ssl_cert = </etc/pki/tls/certs/example2.com.crt
  ssl_key = </etc/pki/tls/private/example2.com.key
}
local ohmygodpresents.co.uk {
  ssl_cert = </etc/pki/tls/certs/example3.co.uk.crt
  ssl_key = </etc/pki/tls/private/example3.co.uk.key
}

最佳答案



它本身不是鸽舍。

客户端需要使用TLS 1.0或更高版本,并且需要利用服务器名称指示(SNI)扩展。否则,在建立 channel 时,Dovecot不知道客户端试图连接到哪个虚拟服务器。

您可以使用OpenSSL s_client复制/测试它。例如,“良好”连接:

openssl s_client -tls1 -starttls smtp -connect mail.example.com:587 -servername mail.example.com

在上面的示例中,Dovecot将知道在SSL/TLS连接启动时发送example.com的证书。即使在邮件中使用了STARTTLS扩展名,Dovecot也不知道虚拟服务器,因为尚未发送RCPT命令。由于尚未发送RCPT命令,因此Dovecot不知道用户或他/她的域。

这是一个“不良”连接。它的SSLv3,因此无法利用SNI(SNI是TLS扩展):
openssl s_client -ssl3 -starttls smtp -connect mail.example.com:587

这是另一个“坏”的连接。其TLS 1.0,但未使用SNI:
openssl s_client -tls1 -starttls smtp -connect mail.example.com:587

您也可以使用Wireshark复制/测试/观察。 SNI作为ClientHello的一部分以纯文本形式发送。因此,您将能够看到协议(protocol),密码套件,诸如SNI的扩展以及其他参数。 SSL/TLS握手和 key 交换中的所有内容均为纯文本(有些免除)。发送Finished消息后,将对纯文本消息进行完整性检查。

您可以禁用SSLv2/SSLv3并强制使用TLS,对于大多数客户端,一切都会按预期进行。但是,客户端不必发送SNI扩展名。 Windows XP客户端将是一个问题-它们使用TLS 1.0,但省略了SNI。因此,除了使用现代客户端之外,实际上没有其他解决方法。

您的另一个选择是创建“ super 证书”。也就是说,使用具有邮件服务器服务的所有DNS名称的证书。对于您的情况,将一个证书与SAN一起使用DNS:3und80.deDNS:ohmygodpresents.co.ukDNS:example1.com等。每次添加新域或删除现有域时,都将必须获得一个新证书。

10-06 14:12
查看更多