¿Cómo instalar openssl 1.1.1 para python 2.7?

8

Instalé python 2.7.17 en una máquina con Windows 10. Entonces quería probar su versión openssl ejecutando lo siguiente dentro de python:

import ssl
print ssl.OPENSSL_VERSION_INFO

Estoy obteniendo (1, 0, 2, 20, 15) que quería actualizar a la versión 1.1.1. Haciendo congelación pip me sale:

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

Estos parecen ser los últimos en pip para pyOpenSSL y criptografía.

El openssl que he instalado (como parte de git bash) es 1.1.1, sin embargo, esta no es la misma versión utilizada dentro de python.

¿Cómo actualizo la versión de openssl incluida en python a 1.1.1 o superior?

EDITAR: en respuesta a los comentarios, lo siguiente es el resultado de 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']

Como se indicó anteriormente, la criptografía y pyOpenSSL son los últimos en pip.

Assaf Mendelson
fuente
¿Hay alguna razón muy buena por la que estás usando python2.7? Porque ya no es compatible y realmente deberías usar python3
Uli Sotschok
@UliSotschok porque la aplicación que usa este python no es compatible con python 3 y probablemente nunca lo hará ...
Assaf Mendelson
¿Cuál es el resultado de py -m OpenSSL.debug? ¿Has intentado actualizar cada uno de los módulos enumerados?
Arn
¿Qué módulos quieres usar OpenSSL 1.1.1 pero no son?
CristiFati
@CristiFati, la aplicación que estoy usando usa pyOpenSSL. Como se indicó, la validación para la versión adecuada se realiza mediante la importación de SSL y luego imprime ssl.OPENSSL_VERSION_INFO. Debería estar viendo 1.1.1 o posterior
Assaf Mendelson

Respuestas:

4

La única forma de hacer que Python 2.7 use la versión actual de OpenSSL 1.1.1d para su sslmó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 makesistema de compilación basado en * nix. Puede ver la solución, los proyectos y los archivos de propiedades de Visual Studio asociados en el PCbuildsubdirectorio 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 PCbuildsubdirectorio 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. v141significa 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 libeayproyecto 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.batscript por lotes para descargar las bibliotecas precompiladas OpenSSL 1.1.1d del repositorio cpython-bin-deps mencionado anteriormente.
  • Modificó el openssl.propsarchivo de propiedades que configura varias de las configuraciones _ssly del _hashlibproyecto, e hizo algunos cambios en esos proyectos también. Los ajustes se tomaron principalmente del v3.8.1lanzamiento 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.cy Modules/timemodule.csimilares 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.1y ejecutando el comando de compilación PCbuildcomo se mencionó anteriormente. Si hay suficientes personas interesadas, puedo limpiarlo y conservarlo.

Reinier Torenbeek
fuente