Связано с #1083, возможно. Стандартный результат requests.get()
для этого сайта/страницы https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html
:
>>> import requests
>>> requests.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Используя request-toolbelt
's SSLAdapter
, чтобы попробовать различные версии ssl, все они терпят неудачу, казалось бы... см. следующие трассировки.
TLSv1:
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv3:
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
Обратите внимание, что последний выдает ошибку Connection reset by peer
, которая отличается от других, но я почти уверен, что SSLv2 все равно не поддерживается сервером.
Ради интереса я попытался также передать некоторые более подходящие заголовки по последнему запросу:
>>> headers = {
... 'Accept': u"text/html,application/xhtml+xml,application/xml",
... 'User-Agent': u"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36",
... 'Accept-Encoding': u"gzip,deflate",
... 'Accept-Language': u"en-US,en;q=0.8"
... }
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html', headers=headers)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
Там тоже нет кубиков. Вот как выглядит информация о соединении HTTPS в Chrome на Mac:
Я не уверен, но некоторые гуглы указывают, что это, вероятно, проблема со списком шифров, что, я думаю, больше urllib3?
Я попытался изменить DEFAULT_CIPHER_LIST
в pyopenssl
, но начал сталкиваться с ошибками импорта. В этот момент казалось, что все просто сломано, и еще не было подходящего способа исправить это.
Информация о версии:
ОС X Маверикс
Питон 2.7.5
OpenSSL 0.9.8y 5 февраля 2013 г. — (от python -c "import ssl; print ssl.OPENSSL_VERSION"
)
запросы 2.2.1
запросы-инструментарий 0.2.0
urllib3 1.8
К сожалению, это не связано с проблемой, которую вы определили, и полностью зависит от дрянного OpenSSL, с которым OS X поставляется по умолчанию. Версия 0.9.8y имеет некоторые реальные проблемы с выполнением рукопожатий SSL, и некоторые серверы не очень хорошо это переносят. Использование Python 3 на моем компьютере с OS X (поэтому используется более новый OpenSSL) показывает, что проблем нет.
У вас есть два варианта:
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
.Ах, похоже, тогда я следовал за отвлекающим маневром - я все равно не планирую развертывать что-либо на OSX. Похоже, я перенесу тестирование на виртуальный ящик Linux. Приносим извинения за этот многословный вопрос!
Не нужно извиняться, задать этот вопрос было правильно: знать, что у OS X есть эта проблема, — это странно специфичное знание. знак равно
Ладно, это облом. Я создал 32-битный образ Virtualbox сервера Ubuntu 14.04 через Vagrant, и все это все еще происходит, за исключением случая с SSLv2, где он не работает, потому что протокол не включен в версию OpenSSL в Ubuntu 14.04 (я полагаю, что по замыслу - SSLv2 устарел и устаревшее).
Версии:
Ubuntu 14.04 32bit (через комбинацию Vagrant/Virtualbox)
Питон 2.7.6
запросы == 2.2.1
запросы-инструментальный пояс == 0.2.0
urllib3==1.8.2
РЕДАКТИРОВАТЬ: забыл версию OpenSSL...
python -c "импортировать ssl; распечатать ssl.OPENSSL_VERSION"
OpenSSL 1.0.1f 6 января 2014 г.
TLSv1:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv23:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv23')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Возможно, тогда это проблема списка шифров? Или используемая здесь версия OpenSSL все еще проблематична?
Я абсолютно готов потратить некоторое время, чтобы помочь отладить это, если это необходимо... если вы, ребята, дадите мне какое-то направление.
ВМ загружается. Я не могу воспроизвести это в ArchLinux.
Трассировки стека указывают на это, но я хотел бы быть уверен: вы _не_ используете PyOpenSSL, а только stdlib?
@ t-8ch Спасибо, что посмотрели, я немного запутался. OpenSSL сильно усложняет мне жизнь =(
@ t-8ch Я не устанавливал PyOpenSSL, если вы об этом спрашиваете?
Я бы предположил (возможно, неправильно), что pip install requests
должен дать мне все необходимое для успешного вызова requests.get('...')
на странице HTTPS. Что, конечно, по большей части работает, только не для этого сайта почему-то.
@jaddison Это _в основном_ так и есть. К сожалению, стандартная библиотека Python 2.7 сильно отстой и не поддерживает некоторые функции, такие как SNI.
Интересно, это SNI...
@jaddison За кулисами есть два разных пути кода. Вам не нужно заботиться об этом, но это помогает знать при отладке.
Однако теперь я могу воспроизвести это на Ubuntu. Но только о Пы2. На Py3 все нормально.
Я подозреваю, что @Lukasa прав, и сервер выходит из строя, когда клиент не использует SNI.
Меня беспокоит, что отсутствие SNI дает сбой по-разному, в зависимости от рассматриваемого сервера.
Я заметил это изменение между OpenSSL 1.0.1f и 1.0.1g (https://www.openssl.org/news/openssl-1.0.1-notes.html):
Add TLS padding extension workaround for broken servers.
РЕДАКТИРОВАТЬ: Ах, неважно - я думаю, ошибка не должна варьироваться между Py 2 и 3.
@jaddison Чтобы проверить, является ли это SNI, вам нужно установить требования SNI для Python 2.
@Лукаса был прав. Сравнивать:
$ openssl s_client -connect docs.apitools.com:443
CONNECTED(00000003)
139846853338768:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:762:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 517 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$ openssl s_client -connect docs.apitools.com:443 -servername docs.apitools.com
... happy handshake here
Чтобы уточнить: вторая команда включает функциональность SNI openssl s_client
.
Вы можете а) переключиться на python3 б) установить дополнительные зависимости.
В stdlib на данный момент нет возможности сделать SNI.
Спасибо за быстрый отзыв. Поскольку ошибки нет, я закрою это... снова.
Эй, спасибо, ребята !! Я установил python3 на свой Mac и, бум, он работает.
Просто хочу вмешаться и сказать, что я столкнулся с этой проблемой в OS X 10.9.5, Python 2.7.7 и OpenSSL 0.9.8zc.
Мне удалось исправить проблему с рукопожатием:
brew install OpenSSL
cryptography
, связанного с новым OpenSSL ( env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install cryptography
)pip install requests[security]
Спасибо, @Microserf. Я в значительной степени использую те же спецификации (10.9.5, Python 2.7.6, установленный через Homebrew, но скомпилированный с системой, предоставленной OpenSSL 0.9.8zg), и это был весь мой процесс установки и запуска requests
для Django. :
brew install openssl
Установите requests
с кучей SNI , скомпилированных для нашей новой установки OpenSSL. Опция [security]
просто устанавливает pyopenssl ndg-httpsclient pyasn1
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install requests[security] urllib3
И мы готовы идти:
"""
This may or may not be needed. See:
https://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl
"""
# from urllib3.contrib import pyopenssl
# pyopenssl.inject_into_urllib3()
import requests
# r = requests.get(...)
Есть ли окончательный ответ о том, как заставить это работать на Ubuntu? Я столкнулся с этой проблемой, и похоже, что единственный ответ здесь касается того, как заставить это работать на Mac. Обновление всей нашей кодовой базы до Python 3 не вариант.
Хорошо, я, возможно, только что ответил на свой вопрос. То, что я сделал, сводится к:
sudo apt-get install libffi-dev
pip install pyOpenSSL ndg-httpsclient pyasn1
@lsemel спасибо, это сэкономило мне кучу времени
@lsemel Ты уверен? Я попробовал это на Ubuntu 15.10, и он по-прежнему не работает с Python 2.7.10.
Он работает с Python 2.7 на Travis CI:
https://travis-ci.org/playing-se/swish-python
Получил это, чтобы работать сейчас! Я просто удалил pyOpenSSL:
pip uninstall pyOpenSSL
Может быть, нам следует использовать pyopenssl.inject_into_urllib3() только в том случае, если версия Python меньше 2.7.9? pyOpenSSL, кажется, ломает вещи в Ubuntu и Windows, если версия Python 2.7.10.
PyOpenSSL не должен ничего ломать. Если это так, это ошибка, о которой следует сообщить.
Мне придется изучить это, но есть ли веская причина для внедрения pyopenssl в urllib3, если версия Python 2.7.9 или новее?
Я думаю о чем-то вроде этого:
# Check if Modern SSL with SNI support
try:
from ssl import SSLContext
from ssl import HAS_SNI
except ImportError:
# Attempt to enable urllib3's SNI support, if possible
try:
from .packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3()
except ImportError:
pass
Да, часто есть. Например, в OS X большинство Python связываются с системой OpenSSL версии 0.9.8zg. Однако PyOpenSSL будет ссылаться на гораздо более новый OpenSSL (1.0.2). Это делает использование PyOpenSSL существенным улучшением безопасности.
Кроме того, PyOpenSSL дает нам гораздо лучший доступ к OpenSSL, позволяя нам более эффективно защищать его.
Хорошо, я немного поиграл с этим сейчас.
Он РАБОТАЕТ с pyopenssl, НО не если установлен ndg-httpsclient.
Однако я могу заставить его работать с ndg-httpsclient, если я удалю pyasn1, выдающий мне эти предупреждения:
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/ssl_peer_verification.py:25: UserWarning: SubjectAltName support is disabled - check pyasn1 package installation to enable
warnings.warn(SUBJ_ALT_NAME_SUPPORT_MSG)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
Такое же поведение в Ubuntu 15.10 и Windows 10 с установленным Python 2.7.10.
Это потому, что без ndg-httpsclient поддержка PyOpenSSL не используется.
Да, мне придется разобраться, почему это работает, если SubjectAltName отключен. Есть идеи?
Почти наверняка проблема в том, что вы используете разные OpenSSL в каждом случае.
У меня была такая же проблема с моей коробкой Ubuntu 14.04 и Python 2.7.11.
Это из СНИ
Что сработало для меня, так это:
Я думаю, что во время установки была проверка urllib3 или запросов, из-за которых вещи не работали без удаления.
@jvanasco , что вы используете для установки этих пакетов? Я полагаю, Пип. Почему вы устанавливаете urllib3 и запросы отдельно?
Ну, мне нужен был urllib3 в virtualenv... но я установил его, чтобы попытаться установить требования с помощью pip и easy_install. (использовал оба)
У меня есть веб-индексатор, и несколько URL-адресов сломались. Я написал быстрый скрипт, чтобы попробовать сломанные, и продолжал переустанавливать / удалять + устанавливать пакеты в инструкциях urllib3 по проблемам с ssl, пока они не заработали.
31 мая 2016 г., в 19:25 Ян Кордаско, [email protected] , написал:
@jvanasco , что вы используете для установки этих пакетов? Я полагаю, Пип. Почему вы устанавливаете urllib3 и запросы отдельно?
—
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите ветку.
Я все еще вижу эту проблему, и я пробовал предложенные обходные пути.
Я обновил свою версию Python до 2.7.11.
Я установил 3 дополнительных пакета.
Я попробовал последовательность удаления/установки, предложенную @jvanasco , и все равно получил SSLError
Также с использованием Ubuntu 14.04, к сожалению, нет обновления OpenSSL, поэтому мне приходится использовать обходные пути, опубликованные здесь, и мне не повезло.
Какие-то дополнительные шаги вы, ребята, возможно, предприняли?
Спасибо
@Lekinho Я обнаружил, что создание короткого тестового сценария для проверки домена, с которым у меня возникли проблемы, помогло.
это было просто:
import requests
r = requests.get(bad_url)
print r.__dict__
@Lekinho Вы можете извлечь pyopenssl из запросов в своем коде:
try:
from requests.packages.urllib3.contrib import pyopenssl
pyopenssl.extract_from_urllib3()
except ImportError:
pass
@Lekinho Если вы все еще сталкиваетесь с этой проблемой с Python 2.7.11, весьма вероятно, что удаленный сервер не поддерживает настройки TLS, используемые запросами. Доступен ли рассматриваемый сервер в общедоступном Интернете? Если да, можете ли вы предоставить мне URL-адрес?
я пробовал импорт pyopenssl, как было предложено.
К сожалению, в открытом доступе это недоступно.
Однако у меня есть точная информация о том, какая версия openSSL установлена на сервере.
По сути, мы запускаем виртуальную машину RedHat, у меня был этот openSSL, когда все работало: openssl-1.0.1e-42.el6_7.4.x86_64
Затем мы сделали обновление RedHat, и появилось обновление для openssl: openssl-1.0.1e-48.el6_8.1.x86_64.
В этой версии всегда возникает проблема с неправильным рукопожатием при использовании openssl в Ubuntu 14.04.
У вас, ребята, есть какие-либо общедоступные URL-адреса, с которыми я могу попробовать, чтобы увидеть, помогли ли обходные пути решить проблему, и проблема заключается именно в этой уникальной комбинации?
На той же машине все в порядке, когда запросы REST отправляются через браузер (т.е. без ubuntu openssl).
Спасибо
Можете ли вы предоставить вывод rpm -q --changelog openssl
, пожалуйста?
[ admin@leke-2-2-8-11 ~]$ rpm -q --changelog openssl
Похоже, @Lekinho удалил свою учетную запись на github? Для следующего человека, у которого есть проблемы: возможно, их обновление OpenSsl или Python сломало некоторые скомпилированные привязки c. Всякий раз, когда у меня происходит такое обновление, я выбрасываю свой virtualenv или все пакеты, а затем создаю новый.
@jvanasco я все еще здесь.
Мне было интересно, у вас есть общедоступный URL-адрес, с которым я мог бы проверить это? Я хочу посмотреть, действительно ли обходной путь решает проблему для подтвержденных случаев (это будет означать, что я ничего не напортачил, пытаясь это сделать)
@Лукаса
подмножество набора изменений между рабочей версией и обновленной версией: +1:
Пн, 02 мая 2016 г. Томаш Мраз [email protected] 1.0.1e-48.1
исправить CVE-2016-2105 - возможное переполнение в кодировке base64
исправить CVE-2016-2106 - возможное переполнение в EVP_EncryptUpdate()
исправление CVE-2016-2107 - заполнение оракула в прошитом AES-NI CBC-MAC
исправить CVE-2016-2108 — повреждение памяти в кодировщике ASN.1
исправить CVE-2016-2109 — возможный отказ в обслуживании при чтении данных ASN.1 из BIO
исправить CVE-2016-0799 — проблемы с памятью в BIO_printf
Ср, 24 февраля 2016 г. Томаш Мраз [email protected] 1.0.1e-48
исправление CVE-2016-0702 — атака по сторонним каналам на модульное возведение в степень
исправление CVE-2016-0705 — двойное освобождение при разборе закрытого ключа DSA
исправить CVE-2016-0797 — повреждение кучи в BN_hex2bn и BN_dec2bn
Вт, 16 февраля 2016 г. Томаш Мраз [email protected] 1.0.1e-47
исправить CVE-2015-3197 — принудительное применение набора шифров SSLv2
отключить SSLv2 в общем методе TLS
Пт, 15 января 2016 г. Томаш Мраз [email protected] 1.0.1e-46
исправить 1-байтовую утечку памяти при синтаксическом анализе pkcs12 (#1229871)
задокументировать некоторые параметры команды скорости (#1197095)
Чт, 14 января 2016 г. Томаш Мраз [email protected] 1.0.1e-45
исправить высокоточные временные метки в органе временных меток
Пн, 21 декабря 2015 г. Томаш Мраз [email protected] 1.0.1e-44
исправить CVE-2015-7575 — запретить использование MD5 в TLS1.2
Пт, 04 декабря 2015 г. Томаш Мраз [email protected] 1.0.1e-43
исправить CVE-2015-3194 — сбой проверки сертификата с отсутствующим параметром PSS
исправить CVE-2015-3195 — утечка памяти X509_ATTRIBUTE
исправить CVE-2015-3196 — состояние гонки при обработке подсказки идентификации PSK
Вт, 23 июня 2015 г. Томаш Мраз [email protected] 1.0.1e-42
Обновлять :
Поэтому я нашел обходной путь для этого.
По сути, коллега читал об этой проблеме и видел несколько сообщений о том, что поддержка RHEL openssl для шифрования ECC/ECDH не является 100% по какой-либо причине.
Мы опробовали запрос к URL-адресу, явно отключив шифры ECDH (добавив отрицание из самого скрипта openssl, т.е. openssl s_client -connect 10.85.103.218:8443 -cipher 'DEFAULT:!ECDH')
Нам удалось успешно подключиться.
Вот список шифров по умолчанию для openssl в Ubuntu 14.04.
ECDH+ AESGCM:DH+AESGCM :ECDH+AES256:DH+AES256:ECDH+AES128:DH+ AES:ECDH+HIGH :DH+ HIGH:ECDH+3DES :DH+3 DES:RSA+AESGCM :RSA+ AES:RSA+HIGH :RSA +3DES:!aNULL:!eNULL:!MD5
Итак, обладая этими знаниями, я использовал pyopenssl для распечатки моих шифров SSL по умолчанию и явно удалил каждый шифр ECDH из строки. Сделал это прямо в блоке, чтобы импортировать urllib3 из пакета запросов (т.е. до того, как начать делать какие-либо фактические запросы), вот что-то похожее:
https://github.com/kennethreitz/requests/issues/1308
Я понимаю, что это действие может быть сопряжено с риском для безопасности, но, по крайней мере, оно заставляет нас двигаться дальше и проливает на это больше света.
Почему именно эти шифры представляют проблему для RHEL, я понятия не имею.
Я постараюсь, когда у меня будет больше времени, посмотреть, какие конкретные изменения RHEL могли внести это, и больше узнать о цели.
Кто-нибудь знает больше о шифрах в целом?
Такая же проблема... АРГ...
Разочарование @lukas-gitl не поможет вам решить проблему. Предоставление нам информации о вашем окружении (желательно некоторой, если не всей, информации, которую мы запрашивали у Lekinho выше) поможет.
@sigmavirus24 Извинения. Я хотел предоставить больше информации, а потом отвлекся (поскольку у меня не было на это времени). Я использую Ubuntu 14.04, python 2.7.6 и последнюю версию запросов на pip. Это происходит, когда я пытаюсь получить доступ в качестве конечной точки шлюза API (они могут быть весьма ограничительными).
Я попытался удалить virtualenv и восстановить его, но, к сожалению, это не решило проблему.
Дайте мне знать, что еще вам нужно. Я переключился на nodejs на время, но был бы рад помочь с решением.
@ lukas-gitl Весьма вероятно, что серверу, с которым вы связываетесь, требуются шифры, которые вы не предлагаете, или версии TLS, которые вы не предлагаете. Это может быть связано с установленным вами OpenSSL. Вам также следует попробовать запустить pip install requests[security]
: у вас могут возникнуть проблемы с SNI.
Ага, я тоже уже пробовал. Позвольте мне собрать здесь быстрый тестовый сценарий, чтобы мы были на одной странице.
virtualenv -p /usr/bin/python2.7 env
источник env/bin/активировать
запросы на установку pip
запросы на установку pip[безопасность]
echo 'запросы на импорт' >> test.py
echo 'requests.get("https://API_ID.execute-api.us-west-2.amazonaws.com/ENV/ENPOINT")' >> test.py
Python test.py
И какую конкретно ошибку вы видите?
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:318:
SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
SNIMissingWarning
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Traceback (most recent call last):
File "test.py", line 2, in <module>
requests.get("https://sbsz8eqowe.execute-api.us-west-2.amazonaws.com/dev/segment_to_s3_webhook")
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure```
Так что мне в основном требуется обновить до более поздней версии Python?
Хорошо, оба этих предупреждения предполагают, что ваши запросы на самом деле не используют расширения из request[security]. Это настоятельно предполагает, что любой Python, который вы выполняете, _не_ тот, который вы установили в своей виртуальной среде: расширение request[security] должно удалить эти предупреждения.
@ lukas-gitl, пожалуйста, смотрите мои заметки выше.
У вас есть доступ к серверу? сравните список шифров по умолчанию для сервера и клиента.
Весьма вероятно, что один из них не поддерживает первый набор шифров в другом, отсюда и ошибка.
Вы можете проверить шифры по умолчанию с помощью простого скрипта, подобного тому, что я использовал здесь:
импорт системы
импорт ОС
импорт SSL
печать (ssl.OPENSSL_VERSION)
sys.path.insert(1, os.path.abspath(os.path.join(os.getcwd(), 'lib')))
sys.path.append('/usr/local/lib/python2.7/dist-пакеты')
запросы на импорт
из запросов.пакетов.urllib3.contrib импортировать pyopenssl
pyopenssl.inject_into_urllib3()
распечатать pyopenssl.DEFAULT_SSL_CIPHER_LIST
Хорошо, теперь я действительно смущен. Сообщение об ошибке исходит из виртуальной среды. Итак, как они могли появиться оттуда, пока я выполняю из другой среды Python?
Поэтому я попробовал pip install pyopenssl ndg-httpsclient pyasn1
вместо pip install requests[security]
, и это сработало...
Ага, я подозреваю, что ваш пункт слишком стар, чтобы справиться с дополнительными услугами.
Ах, черт. Это многое объясняет. Большое спасибо за Вашу помощь!
Здесь я столкнулся с той же проблемой, мне нужно было отправить запрос GET по следующему коду:
requests.get('https://mdskip.taobao.com/core/initItemDetail.htm?itemId=530444505608&showShopProm=false&queryMemberRight=true&isRegionLevel=false&tmallBuySupport=true&addressLevel=2&sellerPreview=false&isForbidBuyItem=false&cachedTimestamp=1466835924196&offlineShop=false&household=false&tryBeforeBuy=false&isSecKill=false&service3C=false&isApparel=true&isUseInventoryCenter=false&cartEnable=true&isAreaSell=false&callback=setMdskip×tamp=1466841669969&isg=Al9faN3XWRpIf6UEoQ88UH/1b7np0rNm&ref=https%3A%2F%2Fs.taobao.com%2Fsearch%3Fq%3D%25E6%258B%2589%25E5%25A4%258F%25E8%25B4%259D%25E5%25B0%2594%26imgfile%3D%26commend%3Dall%26ssid%3Ds5-e%26search_type%3Ditem%26sourceId%3Dtb.index%26spm%3Da21bo.50862.201856-taobao-item.1%26ie%3Dutf8%26initiative_id%3Dtbindexz_20160625')
к сожалению, мне дали информацию об ошибке:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
Я пытался варить установку openssl, варить обновление openssl, pip install --upgrade pip, запросы на установку pip, запрос на установку pip [безопасность], но они не работали.
Однако, когда я набираю openssl version
, я получаю OpenSSL 0.9.8zh 14 Jan 2016
, я не знаю, все ли в порядке.
Есть ли кто-нибудь, кто мог бы помочь мне с этим?
@ jschwinger23 Не могли бы вы также запустить pip install pyopenssl ndg-httpsclient pyasn1
, пожалуйста?
@Lukasa Спасибо за ответ. Я подтвердил, что установил их:
$ pip install pyopenssl ndg-httpsclient pyasn1
Requirement already satisfied (use --upgrade to upgrade): pyopenssl in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Requirement already satisfied (use --upgrade to upgrade): ndg-httpsclient in /Library/Python/2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pyasn1 in /Library/Python/2.7/site-packages
но код все еще не работает.
Так или иначе, я понял, что в Python3 все идет хорошо, и я рад, что могу писать код на python3.
Спасибо большое.
Выполнил приведенные выше инструкции, но все еще сталкивается с этой проблемой
```
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
Любые идеи?
``````
@rohanpai Вполне вероятно, что у вас либо нет перекрытия шифров, либо удаленный сервер недоволен предлагаемыми вами версиями, либо вы должны предоставить сертификат клиента, а этого нет. Трудно дать более конкретный совет. Попробуйте это , чтобы исследовать проблему.
В Ubuntu 14.04LTS мне нужно было сделать это:
sudo pip install ndg-httpsclient pyasn1 --upgrade
Обратите внимание, что в Ubuntu невозможно обновить/удалить pyopenssl
, так как он принадлежит ОС.
решение Маркстреффорда сработало и для меня на mac os sierra
Решение @markstrefford также сработало для меня.
Просто предупреждение для тех, кто использует OpenSSL 1.1:
Вы также столкнетесь с этой проблемой, даже при форсировании адаптеров TLS, когда удаленный сервер предлагает эллиптические кривые в качестве первого варианта.
Причина: http://bugs.python.org/issue29697 .
Привет ребят! У меня такая же проблема со следующим сервером https://34.200.105.231/SID/Service.svc?wsdl
. Я пробовал все, и я прыгаю от и к тем же 2 ошибкам:
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:661)
Есть идеи? @Lukasa , я вижу несколько проблем с сертификатом, но кажется, что это не должно быть так уж плохо: https://sslanalyzer.comodoca.com/?url=34.200.105.231
Сертификат обычно не вызывает эту проблему: эта проблема вызвана зависанием сервера , поэтому обычно это результат несоответствия набора шифров. В данном случае это именно то, что происходит, как вы можете видеть здесь .
Честно говоря, это сервер, который никогда не должен быть доступен в открытом Интернете. Безопасных способов связи с этим сервером нет: нет, ноль. Вот почему рукопожатие не удается: запросы принимают только современные наборы шифров, а для этого сервера нет доступных современных наборов шифров. Наилучший вариант — TLS_RSA_WITH_3DES_EDE_CBC_SHA
, который мы удалили, поскольку он уязвим для практических атак на крупномасштабную передачу данных.
Если это ваш сервер, обновите его до лучшей реализации TLS или измените настройки. В противном случае, мой первый совет — пересмотреть возможность общения с этим сервером. Если надо, то можете использовать код здесь , но я настоятельно рекомендую вам надавить на оператора сервера, чтобы он исправил этот бардак.
@Lukasa - спасибо, что проработали это со всеми! Я прочитал и попробовал большую часть этого
При запуске скрипта в Windows все работает.
При запуске скрипта в OSX получите:
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
Я не уверен, что это не сам сервер, но был бы признателен за любую дополнительную помощь, чтобы подтвердить и/или вытащить меня из этой кроличьей норы. Было бы огромной победой заставить его работать.
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install --force-reinstall --no-cache-dir {PACKAGE}
Я не на 100% уверен, что установка против openssl действительно что-то сделала, так как она, казалось, действовала так же, как установка без (например, скорость и обмен сообщениями выглядели одинаково)
Как указано в другом потоке (выше), подключение напрямую через openSSL appears
, чтобы быть счастливым?
openssl s_client -connect XXX.102.7.147:443
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 198 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1493384325
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
Э-э ... OpenSSL технически в порядке, но этот OpenSSL не согласовал шифр (то есть, похоже, он согласовал SSL_NULL_WITH_NULL_NULL
. Можете ли вы запустить ssllabs на своем сервере и проверить, какие наборы шифров он поддерживает?
@Lukasa Это не выставлено в Интернете, есть ли какой-нибудь зонд командной строки, который я мог бы запустить, который мог бы предоставить вам адекватную информацию?
Вы можете попробовать cipherscan .
@Lukasa установил его ... он работает шатко (без вывода, наблюдая за ним) ... отпишусь, если я придумаю что-нибудь, что можно было бы передать. Спасибо за руководство!
@Lukasa большое спасибо за вашу помощь - на самом деле шифрование никогда не работало, но мы исправили наши проблемы. Это не имело ничего общего со всем этим и было глупым несоответствием IP-адресов в наших средах ... извлеченные уроки! Спасибо ...
Ничего страшного, рад что разобрались!
streamlink -l debug h ttpstream://https ://www.arconaitv.us/stream.php?id= 43 худшее
[cli][info] streamlink работает от имени пользователя root! Будь осторожен!
[cli][debug] ОС: Linux-4.14.0-041400-generic-x86_64-with-Ubuntu-14.04-trusty
[cli][отладка] Python: 2.7.6
[кли] [отладка] Streamlink: 0.13.0+27.g2ff314c
[cli][debug] Запросы (2.19.1), Socks (1.6.7), Websocket (0.48.0)
[cli][info] Найден соответствующий плагин http для URL h ttpstream://https ://www.arconaitv.us/stream.php?id= 43
[plugin.http][debug] URL= https://www.arconaitv.us/stream.php?id=43; параметры = {}
[cli][info] Доступные трансляции: в прямом эфире (худший, лучший)
[cli][info] Трансляция открытия: прямой эфир (http)
[cli][debug] Предварительная буферизация 8192 байта
[cli][info] Стартовый игрок: /usr/bin/vlc
[cli][debug] Запись потока для вывода
[cli][info] Трансляция завершена
[cli][info] Закрытие открытого потока..
пытался, но не повезло
Наконец-то заработал tvplayer на локальном ПК. Я установил tinyproxy на свой локальный компьютер, но в vps httpproxy xxxx не работает.
с tinyproxy все в порядке, или мне нужно установить какой-нибудь другой прокси-сервер на моем локальном компьютере.
Привет, @maanich , похоже, это не имеет прямого отношения к этой проблеме и не является отчетом о дефекте для запросов, для чего предназначен этот трекер проблем. Если у вас есть вопросы о конфигурации системы, их лучше всего решить на такой платформе, как StackOverflow . Спасибо!
streamlink --https-proxy " http://8xxxx :8000/" --tvplayer-email [email protected] --tvplayer-password vcvdf3 --http-no-ssl-verify https://tvplayer.com/watch /itv лучший --player-no-close --stdout | /var/tmp/youtube/ffmpeg -y -i pipe:0 -vcodec copy -acodec copy -flags -global_header -hls_flags delete_segments -hls_time 10 -hls_list_size 6 /mnt/hls/arc.m3u8
ffmpeg версии 4.0-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 разработчики FFmpeg
построен с помощью gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
конфигурация: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 -- enable-libxml2 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame -- enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable -libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg
libavutil 56. 14.100 / 56. 14.100
libavcodec 58.18.100 / 58.18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
[консоль][информация] Streamlink работает от имени пользователя root! Будь осторожен!
[console][info] Найден соответствующий плагин tvplayer для URL https://tvplayer.com/watch/itv
Ошибка: Не удалось открыть URL: https://live.tvplayer.com/stream.m3u8?id=204&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cCo6XC9cL2xpdmUudHZwbGF5ZXIuY29tXC9zdHJlYW0ubTN1OD9pZD0yMDQiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE1MjkwNTc0OTR9LCJJcEFkZHJlc3MiOnsiQVdTOlNvdXJjZUlwIjoiNjIuMjEwLjE0Mi42NlwvMzIifX19XX0_&Signature=mHOteYcUu4QsbGD n0e ~ 7meDUGT8VN7bVOBAHa-0Mk6ROA9XHYx3aIAZMAo3dFjOGuWk-3MszJzRFHdv ~ -CCsmX3D8XQa2zvzfuIWfMAT ~ yDshroXBN25iW6ZJ0-7lGla00jMTUpm5sW-uDy18OkiBWgGvDVas2Lz-EW ~ 5-LTw2YWvEpqkvRB9OpcsHJj9RRQLuDVjwYKXwKvHTJmB1J ~sGE3aigaL7AZyBaIAUMcpk-xYMpDuPV9BsBN9AT397lFFRPFt155u~yeBHZ4JlUN2GINUBt0-CzGuYVq3dsO kYYEZJo9cQTVhArpo7ek03VbDP5egtCM8obN63AEkA__&Key-Pair-Id=APKAJGWDVCU4SXAPJ
pipe:0 : при обработке ввода обнаружены неверные данные
посоветуйте пожалуйста какой прокси сервер подойдет для стимлинка если есть
Самый полезный комментарий
К сожалению, это не связано с проблемой, которую вы определили, и полностью зависит от дрянного OpenSSL, с которым OS X поставляется по умолчанию. Версия 0.9.8y имеет некоторые реальные проблемы с выполнением рукопожатий SSL, и некоторые серверы не очень хорошо это переносят. Использование Python 3 на моем компьютере с OS X (поэтому используется более новый OpenSSL) показывает, что проблем нет.
У вас есть два варианта:
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
.