Запросы добавили зависимость requests[security]
много-много лет назад, потому что в модуле ssl в stdlib Python не хватало некоторых функций. Поскольку PEP 466 был реализован в Python 2.7.9, модуль ssl поддерживает проверку имени хоста и SNI. 2.7.9 был выпущен в 2014 году. Python 3.7.0 еще больше улучшил ситуацию, делегировав проверку имени хоста OpenSSL. Уровень совместимости PyOpenSSL в urllib3 использует устаревшую функцию ssl.match_hostname
или backport.
Безусловное исправление urllib3 с помощью urllib3.contrib.pyopenssl.inject_into_urllib3
вызывает проблемы.
PyOpenSSL использует динамические обратные вызовы libffi (также известные как обратные вызовы старого стиля cffi). Обратные вызовы реализованы с помощью батутов и динамического создания собственного машинного кода. При этом используются либо исполняемые и записываемые страницы памяти, либо некоторые хаки с общими областями mmap (). Динамические обратные вызовы представляют собой угрозу безопасности и по уважительным причинам блокируются системами безопасности, такими как SELinux (deny_execmem). Мы с Армином Риго исследовали различные способы решения этих проблем, но есть простое решение. В конце концов Армин реализовал новую систему обратного вызова для cffi. Некоторые проблемы со старыми обратными вызовами задокументированы на https://cffi.readthedocs.io/en/latest/using.html#callbacks -old-style.
PyOpenSSL в настоящее время использует версии криптографии, которая сама зависит от asn1crypto. Проблема с asn1crypto и ctypes приводит к сбою Python в последних версиях macOS, https://github.com/pyca/pyopenssl/issues/874 и https://github.com/wbond/asn1crypto/issues/158 .
Из-за ошибок вроде https://bugzilla.redhat.com/show_bug.cgi?id=1535689 я убедил сопровождающих Fedora и RHEL исправлять запросы и отбрасывать inject_into_urllib3
некоторое время назад. Дистрибутивы работают с патчем https://src.fedoraproject.org/rpms/python-requests/blob/master/f/Don-t-inject-pyopenssl-into-urllib3.patch более года без каких-либо проблем. .
Предлагаю:
1) Удалите лишние requests[security]
.
2) Удалите безоговорочно monkey-patch urllib3 из запросов.
Точка данных для поддержки этого направления для запросов и urllib3: 91% (7 298 352/7 993 356) загрузок Python 2.7.X для urllib3 были на Python 2.7.9+. Взято из общедоступного набора данных для скачивания на сегодня.
Соотношение еще больше. Python 2.7.5 на машинах RHEL 7 также имеет обратный порт PEP 466.
$ rpm -qa python
python-2.7.5-88.el7.x86_64
$ python
Python 2.7.5 (default, Sep 26 2019, 13:23:47)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.SSLContext(ssl.PROTOCOL_SSLv23).check_hostname
False
Похоже, это не было закрыто после слияния # 5443. Я думаю, что единственный невыполненный пункт - это requests[security]
. Я склонен пока оставить это для тех, кто все еще использует <Python 2.7.9. Учитывая, что на этой неделе мы, скорее всего, выпустим новую минорную версию с urllib3, мы можем добавить уведомление об отказе от поддержки для следующего минорного релиза.
Я решу это завтра, если никто не обратится. Я думаю, что первоначальный запрос теперь решен.
Самый полезный комментарий
Похоже, это не было закрыто после слияния # 5443. Я думаю, что единственный невыполненный пункт - это
requests[security]
. Я склонен пока оставить это для тех, кто все еще использует <Python 2.7.9. Учитывая, что на этой неделе мы, скорее всего, выпустим новую минорную версию с urllib3, мы можем добавить уведомление об отказе от поддержки для следующего минорного релиза.Я решу это завтра, если никто не обратится. Я думаю, что первоначальный запрос теперь решен.