python3.10呼叫郵件SMTP報錯: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)解決

Iron_Man~發表於2023-01-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)

相關文章