尝试连接 imap 时收到“sslv3 警报握手失败”

Yeh*_*hor 7 python ssl

我需要为 imap 备份编写一个脚本,但是当我尝试使用脚本连接到 imap 服务器时,出现以下错误:

  File "c:\Users\Lenovo\Desktop\python\progettoscuola.py", line 5, in <module>  
    imapSrc = imaplib.IMAP4_SSL('mail.safemail.it')
  File "C:\Program Files\Python310\lib\imaplib.py", line 1323, in __init__      
    IMAP4.__init__(self, host, port, timeout)
  File "C:\Program Files\Python310\lib\imaplib.py", line 202, in __init__       
    self.open(host, port, timeout)
  File "C:\Program Files\Python310\lib\imaplib.py", line 1336, in open
    IMAP4.open(self, host, port, timeout)
  File "C:\Program Files\Python310\lib\imaplib.py", line 312, in open
    self.sock = self._create_socket(timeout)
  File "C:\Program Files\Python310\lib\imaplib.py", line 1327, in _create_socket
    return self.ssl_context.wrap_socket(sock,
  File "C:\Program Files\Python310\lib\ssl.py", line 512, in wrap_socket        
    return self.sslsocket_class._create(
  File "C:\Program Files\Python310\lib\ssl.py", line 1070, in _create
    self.do_handshake()
  File "C:\Program Files\Python310\lib\ssl.py", line 1341, in do_handshake      
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)```
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 17

Python 3.10 增加了 TLS 堆栈的默认安全设置,其中包括禁止任何仍然使用 RSA 密钥交换的密码。RSA 密钥交换长期以来被认为较差,因为它不提供前向保密,因此在 TLS 1.3 中也不再可用。所以总的来说Python 3.10的改变可以被认为是一种改进。

但是,一些服务器仍然需要这种过时的密钥交换,mail.safemail.it 似乎就是其中之一。现在,使用新强化的 TLS 设置连接到此类服务器将会失败,即使使用旧版本的 Python 可以成功连接。

要再次建立连接,必须使用较弱的安全设置。对于此特定服务器,可以通过回退到 OpenSSL 使用的默认密码来完成。以下代码将创建一个新的 SSL 上下文并使用它来连接到主机。这里重要的部分是使用较弱的设置ctx.set_ciphers('DEFAULT')

import imaplib
import ssl
ctx = ssl.create_default_context()
ctx.set_ciphers('DEFAULT')
imapSrc = imaplib.IMAP4_SSL('mail.safemail.it', ssl_context = ctx)
Run Code Online (Sandbox Code Playgroud)

  • @Dmitry:*“您是说该问题是在默认 RSA 密钥交换中观察到的”* - 我是说服务器需要 RSA 密钥交换,而客户端默认情况下不支持 RSA 密钥交换。更改客户端设置以允许 RSA 密钥交换(通过使用 DEFAULT 或显式 RSA)可以解决问题,因为服务器现在可以从客户端获取所需的内容。 (3认同)
  • @Yehor:为连接选择的实际密码使用 RSA 密钥交换。这种密钥交换被认为是过时的,因为它不提供前向保密,即一些攻击者可以嗅探流量,并在他们设法窃取服务器私钥后解密该嗅探的流量。不过,您实际上无法选择使用更安全的密码 - 只能选择使用较弱的密码或根本无法与该服务器建立 TLS 连接。但请注意,对于大多数用途,RSA 密钥交换仍然足够安全。 (2认同)