У меня есть небольшое приложение, которое я написал на Python, и оно работало ... до вчерашнего дня, когда оно внезапно начало давать мне ошибку в соединении HTTPS. Я не помню, было ли обновление, но оба Python 2.7.3rc2 и Python 3.2 терпят неудачу точно так же.
Я прогуглил это и обнаружил, что это происходит, когда люди находятся за прокси, но я не являюсь (и ничего не изменилось в моей сети с тех пор, как в последний раз это работало). компьютер моей штатной медсестрой бежит окна и Python 2.7.2 не имеет никаких проблем (в той же сети).
>>> url = 'https://www.mediafire.com/api/user/get_session_token.php'
>>> response = urllib2.urlopen(url).read()
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:504: EOF occurred in violation of protocol>
В чем дело? Любая помощь приветствуется.
PS: Старые версии Python также не работают, не в моей системе и не во время сеанса в реальном времени с USB, но ДОЛЖНЫ работать в сеансе Ubuntu 11.10.
Ответы:
Похоже, это связано с добавлением поддержки TLS 1.1 и 1.2 к версии OpenSSL, найденной в 12.04. Ошибка подключения может быть воспроизведена с помощью инструмента командной строки OpenSSL:
Соединение будет успешным, если я заставлю соединение использовать TLS 1.0 с
-tls1
аргументом командной строки.Я хотел бы предложить вам подать отчет об ошибке об этой проблеме здесь:
https://bugs.launchpad.net/ubuntu/+filebug
источник
Для питона новичков вроде меня, вот так, чтобы переопределить HTTPLIB самый простой способ. В верхней части питона сценария, включают в себя следующие строки:
С этого момента, вы можете использовать URLLIB или что вы используете так же, как обычно.
Примечание: Это для Python 2.7. Для решения питона 3.x, вам необходимо переопределить класс HTTPSConnection найденный в http.Client. Я оставляю это в качестве упражнения для читателя. :-)
источник
httplib
. Люди могут использовать другие SSL сокеты. Можно было бы исправить ,ssl
а не как в моем ответе ниже.BadStatusLine: ''
Вы можете избежать изменения файла httplib.py путем изменения объекта HTTPSConnection:
Метод запроса создает новый сокет, только если connection.sock не определен. Создание вашего собственного с добавлением параметра ssl_version заставит метод запроса использовать его. Тогда все остальное работает как обычно.
У меня была та же проблема, и это работает для меня.
С уважением
источник
Проблема в том
ssl
, что это не имеет ничего общего с HTTP, так зачем исправлять,httplib
если можно исправлятьssl
. Следующий код должен исправить все сокеты SSL, включая, но не ограничиваясь HTTPS, для Python 2.6+ (встроенныйssl
, не пробовалpyopenssl
).источник
EDIT httplib.py (/usr/lib/pythonX.X/httplib.py на Linux)
НАЙТИ объявление класса HTTPSConnection
Внутри класса код ИЗМЕНИТЬ линия
К
Затем HTTPLIB HTTPS запрос должен работать
источник
Вероятно, эта проблема связана с отключением SSLv2 на веб-сервере, но Python 2.x пытается установить соединение с PROTOCOL_SSLv23 по умолчанию.
Вот ссылка на мой ответ для аналогичной проблемы переполнения стека - /programming//a/24166498/41957
Обновление: это функционально совпадает с ответом @ temoto выше.
источник
Простое исправление, которое сработало для меня, было переопределить протокол SSL по умолчанию:
источник