Como instalar o openssl 1.1.1 para python 2.7?

8

Eu instalei o python 2.7.17 em uma máquina com Windows 10. Eu queria testar sua versão openssl executando o seguinte dentro de python:

import ssl
print ssl.OPENSSL_VERSION_INFO

Estou recebendo o (1, 0, 2, 20, 15) desejo de atualizar para a versão 1.1.1. Fazendo o congelamento do pip, recebo:

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

Estes parecem ser os mais recentes no pip para pyOpenSSL e criptografia.

O openssl que eu instalei (como parte do git bash) é 1.1.1, no entanto, essa não é a mesma versão usada dentro do python.

Como atualizo a versão do openssl incluída no python para 1.1.1 ou superior?

EDIT: Em resposta aos comentários, a seguir é 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 mencionado acima, criptografia e pyOpenSSL são os mais recentes no pip.

Assaf Mendelson
fonte
Existe algum motivo muito bom, por que você está usando python2.7? Porque ele não é mais suportado e você realmente deve usar python3
Uli Sotschok
@UliSotschok porque o aplicativo que usa esse python não suporta python 3 e provavelmente nunca será ...
Assaf Mendelson -
Qual é o resultado de py -m OpenSSL.debug? Você já tentou atualizar cada um dos módulos listados?
Arn
Quais módulos você deseja usar o OpenSSL 1.1.1, mas não o são?
CristiFati 17/02
@CristiFati o aplicativo que estou usando usa pyOpenSSL. Conforme declarado, a validação para a versão correta é feita por import ssl e, em seguida, imprima ssl.OPENSSL_VERSION_INFO. Eu deveria estar vendo 1.1.1 ou posterior
Assaf Mendelson

Respostas:

4

A única maneira de fazer com que o Python 2.7 use a versão atual do OpenSSL 1.1.1d para seu sslmódulo é reconstruí-lo com essa versão do OpenSSL. Para plataformas * nix, isso não é muito difícil; envolve apenas o ajuste de alguns arquivos de configuração inicial. Um teste rápido no macOS mostrou que o código-fonte do Python 2.7 era realmente compatível com a API do OpenSSL 1.1.1d, o que parecia promissor.

Para Windows, no entanto, a reconstrução do Python 2.7 com o OpenSSL 1.1.1d é mais difícil. Isso ocorre porque o sistema de compilação, que depende da Microsoft msbuild, não é tão fácil de ajustar quanto o makesistema de compilação baseado no * nix. Você pode ver a solução do Visual Studio, projetos e arquivos de propriedades associados no subdiretório do PythonPCbuild .

Além disso, as diferenças entre as versões do OpenSSL 1.0.2 e 1.1.1 são um pouco maiores no Windows, porque os nomes das bibliotecas também foram alteradas, enquanto permaneceram as mesmas para a versão * nix.

As modificações necessárias no sistema de compilação do Python para Windows não são muito extensas. Parece que consegui o que você estava procurando, depois de fazer a alteração explicada na parte inferior desta resposta. A compilação real pode ser feita com o seguinte comando executado no PCbuildsubdiretório do Python :

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

para uma compilação de 32 bits ou

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

para uma compilação de 64 bits. As --no-opções são usadas para acelerar o processo e focar no aspecto OpenSSL. v141significa Visual Studio 2017, você precisa estar em um shell do Visual Studio para que isso funcione. Depois disso, o seguinte reproduziu seu teste mostrando o uso do OpenSSL 1.1.1d com o 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

Eu não fiz nenhum teste além disso.


Em resumo, as mudanças para conseguir isso incluem

  • Removido o libeayprojeto da solução. Isso foi usado para criar o OpenSSL 1.0.2 a partir da fonte, mas não é compatível com o OpenSSL 1.1.1. Em vez disso, a solução agora conta com os binários pré-criados do OpenSSL 1.1.1d, conforme fornecido pelo repositório Python no cpython-bin-deps . É possível recriar o OpenSSL como parte do processo de compilação, mas requer mais modificações.
  • Modificado o get_externals.batscript em lote para fazer download das bibliotecas pré-construídas do OpenSSL 1.1.1d do repositório cpython-bin-deps mencionado anteriormente.
  • Modificou o openssl.propsarquivo de propriedades que define várias das configurações _ssle do _hashlibprojeto e também fez algumas alterações nesses projetos. Os ajustes feitos principalmente a partir do v3.8.1lançamento do Python, para vincular às novas bibliotecas OpenSSL e definir os caminhos de inclusão corretamente. Com essa modificação, o OpenSSL não é mais vinculado estaticamente como costumava ser no 2.7.17, mas dinamicamente vinculado.
  • Correções aplicadas aos arquivos Modules/posixmodule.ce Modules/timemodule.csemelhantes a essa correção , para permitir a criação com o Visual Studio 2017 - a mesma versão com a qual os binários OpenSSL pré-criados são criados.

A propósito, mais do que o necessário é baixado no processo de compilação atual, incluindo o OpenSSL e o código-fonte nasm. Isso é apenas para permitir o mínimo de modificações possível nos scripts de compilação originais.

Se você estiver interessado nos detalhes, verifique o commit associado neste fork do repositório cpython, que fiz apenas com o objetivo de esclarecer minha resposta. É baseado na etiqueta original v2.7.17. Você deve poder reproduzir a compilação verificando essa ramificação v2.7.17_ossl_1.1.1e executando o comando de compilação PCbuildconforme mencionado acima. Se houver pessoas interessadas, posso limpá-lo e mantê-lo por perto.

Reinier Torenbeek
fonte