python3.10调用邮件SMTP报错: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)解决

时间:2023-01-26 07:09:26

一: python3.10调用邮件SMTP报错: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)解决

  • 报错内容
 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)```

1.调研原因

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

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

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

2.解决方法

import imaplib
import ssl
ctx = ssl.create_default_context()
ctx.set_ciphers('DEFAULT')
imapSrc = imaplib.IMAP4_SSL('mail.safemail.it', ssl_context = ctx)