Python SSL плохое рукопожатие - PullRequest
0 голосов
/ 05 ноября 2018

У меня очень специфическая проблема. В частности, я хотел бы получить содержимое следующего веб-сайта: https://www.mycardtamoil.it/

Как я понял, у этого сайта есть некоторые проблемы с сертификатом SSL. Если вы откроете его в Chrome, у вас не возникнет проблем, но если вы попытаетесь извлечь контент через cURL (curl https://www.mycardtamoil.it/), вы получите сообщение об ошибке на ssl, которое можно обойти, используя параметр -k

Когда я перехожу на Python3, я не могу обойти эту проблему; код, который я тестировал:

import requests
response = requests.get('https://www.mycardtamoil.it/', verify=False)

но я получаю следующее ожидание:

----------------------------------------------- ---------------------------- SysCallError Traceback (последний вызов прошлой) C: \ ProgramData \ Anaconda3 \ Lib \ сайт-пакеты \ urllib3 \ вно \ pyopenssl.py в wrap_socket (self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname) 440 попробовать: -> 441 cnx.do_handshake () 442 кроме OpenSSL.SSL.WantReadError:

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ OpenSSL \ SSL.py в do_handshake (self) 1906 result = _lib.SSL_do_handshake (self._ssl) -> 1907 self._raise_ssl_error (self._ssl, результат) 1908

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ OpenSSL \ SSL.py в _raise_ssl_error (self, ssl, result) 1631 повысить SysCallError (errno, errorcode.get (errno)) -> 1632 повысить SysCallError (-1, «Неожиданный EOF») 1633 еще:

SysCallError: (-1, «Неожиданный EOF»)

Во время обработки вышеуказанного исключения произошло другое исключение:

SSLError Traceback (самый последний вызов прошлой) C: \ ProgramData \ Anaconda3 \ Lib \ сайт-пакеты \ urllib3 \ connectionpool.py в urlopen (self, метод, url, body, заголовки, повторные попытки, перенаправление, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, ** response_kw) 600 body = body, заголовки = заголовки, -> 601 кусок = кусок) 602

C: \ ProgramData \ Anaconda3 \ Lib \ сайт-пакеты \ urllib3 \ connectionpool.py в _make_request (self, conn, метод, url, timeout, chunked, ** httplib_request_kw) 345 попробовать: -> 346 self._validate_conn (conn) 347 кроме (SocketTimeout, BaseSSLError) как e:

C: \ ProgramData \ Anaconda3 \ Lib \ сайт-пакеты \ urllib3 \ connectionpool.py в _validate_conn (self, conn) 849, если не getattr (conn, 'sock', None): # AppEngine может не иметь .sock -> 850 conn.connect () 851

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ connection.py в подключения (сам) 325 имя_сервера = имя хоста, -> 326 ssl_context = context) 327

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ util \ ssl_.py в ssl_wrap_socket (носок, ключевой файл, certfile, cert_reqs, ca_certs, имя_сервера, ssl_version, шифры, ssl_context, ca_cert_dir) 328 if HAS_SNI: # для платформы: OpenSSL с включенным SNI -> 329 вернуть context.wrap_socket (носок, имя_сервера = имя_сервера) 330

C: \ ProgramData \ Anaconda3 \ Lib \ сайт-пакеты \ urllib3 \ вно \ pyopenssl.py в wrap_socket (self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname) 447 кроме OpenSSL.SSL.Error as e: -> 448 рейз ssl.SSLError ('плохое рукопожатие:% r'% e) 449 перерыв

SSLError: («плохое рукопожатие: SysCallError (-1,« Неожиданный EOF »)»,)

Во время обработки вышеуказанного исключения произошло другое исключение:

MaxRetryError Traceback (самый последний вызовпоследняя) C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ запросы \ adapters.py в отправке (сам, запрос, поток, тайм-аут, проверка, сертификат, прокси) 439 попыток = self.max_retries, -> 440 тайм-аут = тайм-аут 441)

C: \ ProgramData \ Anaconda3 \ Lib \ сайт-пакеты \ urllib3 \ connectionpool.py в urlopen (self, метод, url, body, заголовки, повторные попытки, перенаправление, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, ** response_kw) 638 retries = retries.increment (метод, URL, ошибка = e, _pool = self, -> 639 _stacktrace = sys.exc_info () [2]) 640 попыток. Сон ()

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ util \ retry.py в приращение (self, method, url, response, error, _pool, _stacktrace) 387 если new_retry.is_exhausted (): -> 388 повысить MaxRetryError (_pool, url, error или ResponseError (причина)) 389

MaxRetryError: HTTPSConnectionPool (host = 'www.mycardtamoil.it', порт = 443): максимальное количество повторов превышено с помощью URL: / (вызвано SSLError (SSLError ("плохое рукопожатие: SysCallError (-1, 'неожиданно" EOF ')»,)))

Во время обработки вышеуказанного исключения произошло другое исключение:

SSLError Traceback (самый последний вызов последний) в () 1 запрос на импорт ----> 2 response = запросы.get ('https://www.mycardtamoil.it/', verify = False)

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ запросы \ api.py в get (url, params, ** kwargs) 70 71 kwargs.setdefault ('allow_redirects', True) ---> 72 запроса на возврат ('get', url, params = params, ** kwargs) 73 74

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ запросы \ api.py в запрос (метод, url, ** kwargs) 56 # случаев и выглядят как утечка памяти в других. 57 с sessions.Session () в качестве сессии: ---> 58 return session.request (method = method, url = url, ** kwargs) 59 60

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ запросы \ sessions.py в запрос (self, method, url, params, data, заголовки, куки, файлы, auth, timeout, allow_redirects, прокси, хуки, поток, проверка, сертификат, JSON) 506} 507 send_kwargs.update (настройки) -> 508 отн = self.send (prep, ** send_kwargs) 509 510 возврат или 1059 *

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ запросы \ sessions.py в отправить (самостоятельно, запрос, ** kwargs) 616 617 # Отправить запрос -> 618 r = adapter.send (запрос, ** кваргс) 619 620 # Общее время запроса (приблизительно)

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ запросы \ adapters.py в отправить (самостоятельно, запрос, поток, тайм-аут, проверка, сертификат, прокси) 504 если isinstance (e.reason, _SSLError): 505 # Эта ветка для urllib3 v1.22 и новее. -> 506 повысить SSLError (e, запрос = запрос) 507 508 поднять ConnectionError (e, request = request)

SSLError: HTTPSConnectionPool (host = 'www.mycardtamoil.it', port = 443): Максимальное количество попыток превышено с помощью URL: / (вызвано SSLError (SSLError ("bad рукопожатие: SysCallError (-1, 'Неожиданный EOF') ",),))

Может кто-нибудь помочь мне понять, как я могу это исправить с помощью модуля запросов?

Спасибо заранее, Сальво

1 Ответ

0 голосов
/ 05 ноября 2018

Согласно SSLLabs сервер имеет ужасную настройку. Примечательно, что он поддерживает только TLS 1.0 и менее (даже более или менее сломанный SSLv3 и абсолютно сломанный SSLv2), а также поддерживает только те шифры, которые считаются слабыми или действительно небезопасными.

Хотя клиенты обычно поддерживают TLS 1.0 (все еще считается достаточно безопасным, несмотря на известные проблемы), они обычно не поддерживают слабые и небезопасные шифры - по крайней мере по умолчанию, но иногда они даже не компилируются. Вероятно, менее защищенный шифр, поддерживаемый сервером, - TLS_RSA_WITH_3DES_EDE_CBC_SHA (называемый DES-CBC3-SHA в OpenSSL).

Предполагая, что этот шифр все еще доступен в версии OpenSSL, используемой вашим Python, вы можете взломать запросы на включение этого шифра. Исходя из этого вопроса это можно сделать так:

import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'
requests.get('https://www.mycardtamoil.it/')

Хотя теперь он больше не получает Unexpected EOF, он получает еще одну ошибку: certificate verify failed. Это связано с тем, что настройка серверов не только нарушена в отношении версий протокола и шифров, но и сертификата не настроена должным образом. Отчет SSLLabs показывает среди всех других проблем также

Цепочка сертификатов этого сервера неполная.

Добавление verify=False, как вы это сделали, «исправляет» проблему, добавляя еще больше небезопасности, то есть пропускает проверку сертификата. Смотрите здесь , чтобы узнать, как такие ситуации можно исправить. Хотя неясно, действительно ли правильная проверка сертификата значительно повысит безопасность в этой ситуации, когда вам приходится иметь дело с сильно сломанной и небезопасной системой. Я рекомендую не отправлять конфиденциальные данные в эту систему, независимо от того, используется ли HTTPS или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...