Единственный способ заставить 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
py -m OpenSSL.debug
? Пробовали ли вы обновлять каждый из перечисленных модулей? - person Arn   schedule 16.02.2020