【问题标题】:Dovecot with virtual hosts and SSL - wrong certificate?带有虚拟主机和 SSL 的 Dovecot - 错误的证书?
【发布时间】:2014-06-21 23:02:28
【问题描述】:

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

我已经设置了我的主域 (example.de) 和我的虚拟主机 (example2.com 和 example3.co.uk),我正在使用本地选项。

我的问题:

当我连接到我的服务器时,它抱怨主机名错误 (example3.co.uk) 在我的主域和其他域上获取证书。

如何让 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
}

【问题讨论】:

    标签: ssl ssl-certificate virtualhost centos6 dovecot


    【解决方案1】:

    https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/

    不是

    local domain.com { ...
    

    是的

    local_name domain.com { ...
    

    【讨论】:

      【解决方案2】:

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

      它不是鸽舍本身

      客户端需要使用 TLS 1.0 或更高版本,并且需要使用服务器名称指示 (SNI) 扩展。否则,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 的一部分以纯文本形式发送。因此,您将能够看到协议、密码套件、SNI 等扩展以及其他参数。 SSL/TLS 的握手和密钥交换中的所有内容都是纯文本(有些人放弃)。稍后发送Finished 消息时会检查纯文本消息的完整性。

      您可以禁用 SSLv2/SSLv3 并强制使用 TLS,大多数客户端都会按预期工作。但是,客户端不必发送 SNI 扩展。 Windows XP 客户端将是一个问题——它们使用 TLS 1.0 但忽略了 SNI。所以除了使用现代客户端之外,真的没有其他解决办法。

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

      【讨论】:

      • 您有任何“SAN 证书”完整示例或链接参考吗?
      猜你喜欢
      • 2016-11-05
      • 2011-01-31
      • 2015-11-13
      • 2013-01-27
      • 2014-02-20
      • 2012-04-30
      • 2017-04-07
      • 1970-01-01
      • 2021-01-22
      相关资源
      最近更新 更多