在 Dovecot 中禁用 SSLv3 --> TLS 握手失败:没有共享密码?

信息安全 openssl tls
2021-08-27 15:50:47
  • Ubuntu 12.04
  • OpenSSL 1.0.1-4ubuntu5.20 2012 年 3 月 14 日
  • 鸽舍 2.0.19

情况是我试图通过添加!SSLv3到以下内容来禁用 Dovecot 中的 SSLv3 ssl_cipher_list

ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:!SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

重新启动 Dovecot,然后检查日志,我得到:

10 月 29 日 05:00:46 邮件 dovecot:imap-login:断开连接(无身份验证尝试):rip=118.71.13.x,lip=107.170.105.y,TLS 握手:SSL_accept() 失败:错误:1408A0C1:SSL例程:SSL3_GET_CLIENT_HELLO:没有共享密码

我不明白的是:上面的密码列表支持一些 TLSv1.2:

openssl ciphers -v 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:!SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA' | grep -i tls
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256

tcpdump在使用 Thunderbird 连接到 Dovecot 时运行:

Secure Sockets Layer
    SSL Record Layer: Handshake Protocol: Client Hello
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 177
        Handshake Protocol: Client Hello
            Handshake Type: Client Hello (1)
            Length: 173
            Version: TLS 1.2 (0x0303)
            Random
                GMT Unix Time: May  4, 2099 21:21:49.000000000 ICT
                Random Bytes: db3c676892cb86a10350aae7fa67868ed4935862593455bc...
            Session ID Length: 0
            Cipher Suites Length: 46
            Cipher Suites (23 suites)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)

你可以看到至少客户端和服务器都支持ECDHE-RSA-AES128-GCM-SHA256,为什么握手失败?

Secure Sockets Layer
    TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Handshake Failure)
        Content Type: Alert (21)
        Version: TLS 1.2 (0x0303)
        Length: 2
        Alert Message
            Level: Fatal (2)
            Description: Handshake Failure (40)
2个回答

情况是我试图通过将 !SSLv3 添加到 ssl_cipher_list 来禁用 Dovecot 中的 SSLv3:

这是一个坏主意,因为没有特定于 TLS1.0 和 TLS1.1 的密码,即它们使用与 SSL 3.0 相同的密码。只有 TLS1.2 定义了一些新密码。这意味着,如果您禁用 SSLv3 密码,则没有 SSLv3 客户端可以连接,也没有 TLS1.0 或 TLS1.1 客户端。这可能不是你打算做的。

真正的方法不是禁用 SSLv3 密码,而是禁用 SSLv3 协议,但我在 Dovecot 2.0 中看不到它的选项。根据https://zmap.io/sslv3/servers.html在 Dovecot 2.1+ 中有一个ssl_protocols设置,但同一页面也错误地建议在 Dovecot 2 中禁用 SSLv3 密码,这是错误的。

iircssl_ciphers不是禁用协议的正确位置,请尝试:

# dovecot
ssl_protocols = !SSlv2 !SSLv3

在此之后,我建议使用testssl.sh中的脚本测试您的服务器