La única forma de hacer que Python 2.7 use la versión actual de OpenSSL 1.1.1d para su ssl
módulo es reconstruirlo con esa versión de OpenSSL. Para las plataformas * nix, esto no es demasiado difícil; solo implica ajustar algunos archivos de configuración inicial. Una prueba rápida en macOS mostró que el código fuente de Python 2.7 era realmente compatible con la API OpenSSL 1.1.1d, por lo que parecía prometedor.
Sin embargo, para Windows, reconstruir Python 2.7 con OpenSSL 1.1.1d es más difícil. Esto se debe a que el sistema de compilación, que se basa en el de Microsoft msbuild
, no es tan fácil de ajustar como el make
sistema de compilación basado en * nix. Puede ver la solución, los proyectos y los archivos de propiedades de Visual Studio asociados en el PCbuild
subdirectorio de Python .
Además, las diferencias entre las versiones OpenSSL 1.0.2 y 1.1.1 son ligeramente mayores en Windows, porque los nombres de las bibliotecas también han cambiado, mientras que se han mantenido igual para la versión * nix.
Sin embargo, las modificaciones requeridas al sistema de compilación de Python para Windows no son demasiado extensas. Parece que pude lograr lo que está buscando, después de hacer el cambio explicado al final de esta respuesta. La compilación real se puede hacer con el siguiente comando ejecutado desde el PCbuild
subdirectorio Python :
> build --no-tkinter --no-bsddb -e "/p:PlatformToolset=v141"
para una compilación de 32 bits, o
> build --no-tkinter --no-bsddb -e -p x64 "/p:PlatformToolset=v141"
para una compilación de 64 bits. Las --no-
opciones se utilizan para acelerar el proceso y centrarse en el aspecto OpenSSL. v141
significa Visual Studio 2017, debe estar en un shell de Visual Studio para que esto funcione. Después de eso, lo siguiente reprodujo su prueba que muestra el uso de OpenSSL 1.1.1d con 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
No hice ninguna prueba más allá de esto.
En resumen, los cambios para lograr esto incluyen
- Se eliminó el
libeay
proyecto de la solución. Esto se utilizó para compilar OpenSSL 1.0.2 desde el origen, pero no es compatible con OpenSSL 1.1.1. En cambio, la solución ahora se basa en los binarios de OpenSSL 1.1.1d preconstruidos según lo provisto por el repositorio de Python en cpython-bin-deps . Reconstruir OpenSSL usted mismo como parte del proceso de construcción es posible pero requiere más modificaciones.
- Se modificó el
get_externals.bat
script por lotes para descargar las bibliotecas precompiladas OpenSSL 1.1.1d del repositorio cpython-bin-deps mencionado anteriormente.
- Modificó el
openssl.props
archivo de propiedades que configura varias de las configuraciones _ssl
y del _hashlib
proyecto, e hizo algunos cambios en esos proyectos también. Los ajustes se tomaron principalmente del v3.8.1
lanzamiento de Python, para vincular con las nuevas bibliotecas OpenSSL y establecer las rutas de inclusión correctamente. Con esta modificación, OpenSSL ya no está enlazado estáticamente como solía estar en 2.7.17, sino enlazado dinámicamente.
- Parches aplicados a los archivos
Modules/posixmodule.c
y Modules/timemodule.c
similares a este parche , para permitir la creación con Visual Studio 2017, la misma versión con la que se crean los binarios OpenSSL preconstruidos.
Por cierto, se descargan más cosas de las necesarias en el proceso de compilación actual, incluido el código fuente de OpenSSL y nasm. Esto es solo para permitir la menor cantidad posible de modificaciones a los scripts de compilación originales.
Si está interesado en los detalles, puede consultar la confirmación asociada en esta bifurcación del repositorio de cpython, que hice solo para aclarar mi respuesta. Se basa en la etiqueta original v2.7.17
. Debería poder reproducir la compilación revisando esa rama v2.7.17_ossl_1.1.1
y ejecutando el comando de compilación PCbuild
como se mencionó anteriormente. Si hay suficientes personas interesadas, puedo limpiarlo y conservarlo.