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