Как установить openssl 1.1.1 для python 2.7?

Я установил python 2.7.17 на машину с Windows 10. Затем я хотел протестировать его версию openssl, запустив внутри Python следующее:

import ssl
print ssl.OPENSSL_VERSION_INFO

Я получаю (1, 0, 2, 20, 15) Я хотел обновиться до версии 1.1.1. Выполняя замораживание пипсов, я получаю:

cffi==1.14.0
cryptography==2.8
enum34==1.1.6
ipaddress==1.0.23
pycparser==2.19
pyOpenSSL==19.1.0
six==1.14.0

Кажется, это последние разработки для pyOpenSSL и криптографии.

Я установил openssl (как часть git bash) версии 1.1.1, однако это не та версия, которая используется внутри python.

Как мне обновить версию openssl, включенную в python, до 1.1.1 или выше?

EDIT: В ответ на комментарии ниже приводится результат python -m OpenSSL.debug:

C:\Users\assaf>python -m OpenSSL.debug
pyOpenSSL: 19.1.0
cryptography: 2.8
cffi: 1.14.0
cryptography's compiled against OpenSSL: OpenSSL 1.1.1d  10 Sep 2019
cryptography's linked OpenSSL: OpenSSL 1.1.1d  10 Sep 2019
Pythons's OpenSSL: OpenSSL 1.0.2t  10 Sep 2019
Python executable: C:\Python27\python.exe
Python version: 2.7.17 (v2.7.17:c2f86d86e6, Oct 19 2019, 21:01:17) [MSC v.1500 64 bit (AMD64)]
Platform: win32
sys.path: ['', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']

Как указано выше, криптография и pyOpenSSL являются последними в pip.


person Assaf Mendelson    schedule 13.02.2020    source источник
comment
Есть ли какая-то очень веская причина, по которой вы используете python2.7? Потому что он больше не поддерживается, и вам действительно следует использовать python3.   -  person Uli Sotschok    schedule 13.02.2020
comment
@UliSotschok, потому что приложение, использующее этот python, не поддерживает python 3 и, вероятно, никогда не будет ...   -  person Assaf Mendelson    schedule 14.02.2020
comment
Каков результат py -m OpenSSL.debug? Пробовали ли вы обновлять каждый из перечисленных модулей?   -  person Arn    schedule 16.02.2020
comment
Какие модули вы хотите использовать OpenSSL 1.1.1, но не используете?   -  person CristiFati    schedule 17.02.2020
comment
@CristiFati приложение, которое я использую, использует pyOpenSSL. Как указано, проверка правильной версии выполняется путем импорта ssl, а затем печати ssl.OPENSSL_VERSION_INFO. Я должен увидеть 1.1.1 или более позднюю версию   -  person Assaf Mendelson    schedule 17.02.2020


Ответы (1)


Единственный способ заставить Python 2.7 использовать текущую версию OpenSSL 1.1.1d для своего модуля ssl — это пересобрать его с этой версией OpenSSL. Для платформ *nix это не слишком сложно; это включает в себя только настройку некоторых начальных файлов конфигурации. Быстрый тест на macOS показал, что исходный код Python 2.7 на самом деле совместим с API OpenSSL 1.1.1d, так что это выглядело многообещающе.

Однако для Windows пересборка Python 2.7 с OpenSSL 1.1.1d сложнее. Это связано с тем, что систему сборки, основанную на msbuild от Microsoft, не так легко настроить, как систему сборки на основе make на *nix. Вы можете увидеть связанное решение Visual Studio, проекты и файлы свойств в подкаталоге Python PCbuild< /а>.

Кроме того, различия между версиями OpenSSL 1.0.2 и 1.1.1 в Windows немного больше, поскольку имена библиотек также изменились, тогда как для версии *nix они остались прежними.

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

> build --no-tkinter --no-bsddb -e "/p:PlatformToolset=v141"

для 32-битной сборки или

> build --no-tkinter --no-bsddb -e -p x64 "/p:PlatformToolset=v141"

для 64-битной сборки. Параметры --no- используются для ускорения процесса и сосредоточения внимания на аспекте OpenSSL. v141 означает Visual Studio 2017, для этого вам необходимо находиться в оболочке Visual Studio. После этого следующий тест воспроизвел ваш тест, показывающий использование OpenSSL 1.1.1d с Python 2.7.17:

> win32\python.exe
Python 2.7.17 (tags/v2.7.17-dirty:c2f86d86e6, Feb 20 2020, 01:04:36) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> print ssl.OPENSSL_VERSION
OpenSSL 1.1.1d  10 Sep 2019

Я не делал никаких тестов, кроме этого.


Таким образом, изменения для достижения этого включают

  • Из решения удален проект libeay. Это использовалось для сборки OpenSSL 1.0.2 из исходного кода, но оно не совместимо с OpenSSL 1.1.1. Вместо этого решение теперь использует готовые двоичные файлы OpenSSL 1.1.1d, предоставленные репозиторием Python в cpython. -bin-deps. Самостоятельная пересборка OpenSSL в процессе сборки возможна, но требует дополнительных модификаций.
  • Пакетный скрипт get_externals.bat изменен для загрузки OpenSSL 1.1. Готовые библиотеки .1d из вышеупомянутого репозитория cpython-bin-deps.
  • Изменен файл свойств openssl.props, который настраивает несколько _ssl и _hashlib настройки проекта, а также внес некоторые изменения в сами эти проекты. Корректировки в основном взяты из версии v3.8.1 Python, чтобы связываться с новыми библиотеками OpenSSL и правильно устанавливать пути включения. С этой модификацией OpenSSL больше не компонуется статически, как это было в версии 2.7.17, а компонуется динамически.
  • Применены исправления к файлам Modules/posixmodule.c и Modules/timemodule.c аналогично этот патч, чтобы разрешить сборку с помощью Visual Studio 2017 — той же версии предварительно собранных двоичных файлов OpenSSL создаются с.

Кстати, в текущем процессе сборки загружается больше материала, чем необходимо, включая исходный код OpenSSL и nasm. Это делается только для того, чтобы можно было вносить как можно меньше изменений в исходные сценарии сборки.

Если вас интересуют подробности, вы можете проверить связанный коммит в этой ветке репозитория cpython. что я сделал только для того, чтобы пояснить свой ответ. Он основан на оригинальном теге v2.7.17. Вы сможете воспроизвести сборку, проверив эту ветку v2.7.17_ossl_1.1.1 и выполнив команду сборки в PCbuild, как указано выше. Если достаточное количество людей заинтересуется, я могу почистить его и оставить себе.

person Reinier Torenbeek    schedule 20.02.2020