2014-12-06 1 views
0

Я пытаюсь подключиться к почтовому серверу imap, используя только TLSv1 в Python 3.4.Python 3.4 - Подключение к imap-серверу с использованием только TLSv1

После долгого устранения неисправностей (большинство из которых установлено, что почтовый сервер поддерживает только TLSv1), я обнаружил, что я могу подключиться к серверу с помощью OpenSSL:

openssl s_client -connect mail.calpoly.edu:993 -tls1 

, а также с пакетом гнезд Python 2.7:

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ssl 
>>> import socket 
>>> 
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
>>> ssl_sock = ssl.wrap_socket(sock=sock, ssl_version=ssl.PROTOCOL_TLSv1) 
>>> ssl_sock.connect(('mail.calpoly.edu', 993)) 
>>> ssl_sock 
<ssl.SSLSocket object at 0x7fbab6e7aed8> 

Когда я пытаюсь соединить в Python 3.4, однако, я получаю ошибку Рукопожатие:

Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ssl 
>>> import socket 
>>> 
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
>>> ssl_sock = ssl.wrap_socket(sock=sock, ssl_version=ssl.PROTOCOL_TLSv1) 
>>> ssl_sock.connect(('mail.calpoly.edu', 993)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/ssl.py", line 841, in connect 
    self._real_connect(addr, False) 
    File "/usr/lib/python3.4/ssl.py", line 832, in _real_connect 
    self.do_handshake() 
    File "/usr/lib/python3.4/ssl.py", line 805, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:598) 

Кажется, что Python 3.4 пытается использовать sslv3, хотя я и говорю это не так.

Кто-нибудь знает, почему это происходит и как я могу обойти это?

P.S. - Я буду использовать imaplib в коде, который будет взаимодействовать с сервером. Я использовал сокеты в этом примере, чтобы подчеркнуть, что это не похоже на проблему с пакетом imaplib.

+0

Как вы установили (и построили, если необходимо) свои Python 2.7 и 3.4? Возможно ли, что один был построен с использованием старых библиотек SSL? – abarnert

+0

Оба были установлены через apt-get на Ubuntu 14.04 LTS с OpenSSL версии 1.0.1f. – kavdev

ответ

2

...most of which determined that the mail server only supports TLSv1

Означает ли это, что сервер будет хвалиться любым другим рукопожатием? Обычно клиент запускается с лучшим протоколом, который он может (например, TLSv12), и если сервер его не поддерживает, он просто ответит более низким протоколом (например, TLSv1). Но некоторые серверы просто сломаны или между ними есть сломанный промежуточный блок.

[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure 
.... 
It seems like Python 3.4 tries to use sslv3 even though I tell it not to. 

Не обязательно. TLS1.0 - это просто SSL3.1, и много обработки TLS выполняется с помощью функций SSLv3. Таким образом, это сообщение об ошибке может ввести в заблуждение.

При проверке сервера с some tool он выглядит, что он

  • возвращает «неподдерживаемый протокол» с SSL3.0, который прекрасно.
  • будет croak с TLS1.1 вместо того, чтобы просто вернуться с TLS1.0. Это означает, что сервер или некоторый промежуточный промежуток между ними серьезно нарушены.
  • будет принимать только RC4-MD5 в качестве шифрования и проклинать любые другие шифры. Это также делает его сломанным, потому что вместо этого он должен возвращать «без общих шифров» на неподдерживаемые шифры.

RC4-MD5 также является причиной того, что не работает с python 3.4. В отличие от python 2.7 есть более безопасный набор шифрования по умолчанию, установленный в python 3.4, который включает в себя «..:! MD5». Это означает, что клиент python 3.4 не будет предлагать RC4-MD5 в качестве шифрования, и, таким образом, рукопожатие потерпит неудачу из-за отсутствия общих шифров.

Исправить будет исправление сломанного сервера. Обходным путем может быть явно установить шифр для вашего соединения, то есть wrap_socket(... , ciphers="RC4-MD5") или аналогичный

+0

Большое вам спасибо - явным образом заявляю, что шифры работали! Я даже не подумал проверить набор шифров сервера. – kavdev