2015-02-22 4 views
0

У меня возникли проблемы с подключением через SNI-прокси-сервер с использованием Python, следующий фрагмент кода показывает соединение и выполнение сценария приводит к ошибкам соединения (рукопожатие, неправильная версия) в зависимости от используемой версии ssl :Python SSL через прокси SNI

#!/usr/bin/python 
import requests 
import ssl 
from requests.adapters import HTTPAdapter 
try: 
    from requests.packages.urllib3.poolmanager import PoolManager 
except: 
    from urllib3.poolmanager import PoolManager 

class SSLAdapter(HTTPAdapter): 
    def init_poolmanager(self, connections, maxsize, block=False): 
    ssl_version=ssl.PROTOCOL_TLSv1 
    #ssl_version=ssl.PROTOCOL_SSLv23 
    #ssl_version=ssl.PROTOCOL_SSLv3 
    assert_hostname = 'netflix.com' 
    self.poolmanager = PoolManager(num_pools=connections,maxsize=maxsize,block=block,ssl_version=ssl_version,assert_hostname=assert_hostname) 

def newSession(): 
    s = requests.Session() 
    s.mount('https://', SSLAdapter()) 
    s.headers.update({'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.6 Safari/537.36'}) 
    return s 

urlMain = "https://www.netflix.com" 
session = None 
session = newSession() 
session.get(urlMain, verify=False).text 

Это приводит к:

requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure 

Глядя на журналах с сервера sniproxy, вы можете увидеть, что имя_сервер опущен Нет [];

2015-02-22 08:25:23 000.000.73.222:59288 -> 000.00.77.145:443 -> NONE [] 0/0 bytes tx 0/0 bytes rx 20.179 seconds 

Как изменить скрипт так, чтобы он отправил имя сервера с запросом?

+0

Какую версию python вы используете? Я думаю, что с версиями ниже 2.7.9 нет SNI. –

+0

Только что проверил это 2.7.6, вы уверены в этом? – crankshaft

ответ

0

me: Какую версию python вы используете? Я думаю, что с версиями ниже 2.7.9 нет SNI.

ОП: Просто проверено, оно 2.7.6, вы уверены в этом?

Да, см. https://www.mnot.net/blog/2014/12/27/python_2_and_tls_sni. Это означает, что ваша проблема заключается в том, что вы используете версию python, которая не является SNI. Таким образом, вам либо нужно обновить сам python, либо его части, как описано в urllib3 on python 2.7 SNI error on Google App Engine.

+1

Спасибо, но это не мой код, это аддон-модуль в xbmc (kodi). Похоже, что они включили свои собственные библиотеки python, которые не поддерживают SNI! – crankshaft

+0

@crankshaft, который аддон? – chovy