Wie installiere ich openssl 1.1.1 für Python 2.7?

8

Ich habe Python 2.7.17 auf einem Windows 10-Computer installiert. Ich wollte dann seine openssl-Version testen, indem ich in Python Folgendes ausführte:

import ssl
print ssl.OPENSSL_VERSION_INFO

Ich bekomme ein (1, 0, 2, 20, 15) Upgrade auf Version 1.1.1. Beim Pip Freeze bekomme ich:

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

Dies scheint die neueste Version von pyOpenSSL und Kryptografie zu sein.

Das von mir installierte openssl (als Teil von git bash) ist 1.1.1, dies ist jedoch nicht dieselbe Version, die in Python verwendet wird.

Wie aktualisiere ich die in Python enthaltene Version von openssl auf 1.1.1 oder höher?

BEARBEITEN: Als Antwort auf die Kommentare ist das Folgende ein Ergebnis von 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']

Wie oben erwähnt, sind Kryptografie und pyOpenSSL die neuesten Pip-Versionen.

Assaf Mendelson
quelle
Gibt es einen sehr guten Grund, warum Sie Python2.7 verwenden? Weil es nicht mehr unterstützt wird und Sie Python3
Uli Sotschok
@UliSotschok, weil die Anwendung, die diese Python verwendet, Python 3 nicht unterstützt und es wahrscheinlich nie tun wird ...
Assaf Mendelson
Was ist die Ausgabe von py -m OpenSSL.debug? Haben Sie versucht, jedes der aufgelisteten Module zu aktualisieren?
Arn
Welche Module möchten Sie OpenSSL 1.1.1 verwenden, aber nicht?
CristiFati
@CristiFati Die Anwendung, die ich verwende, verwendet pyOpenSSL. Wie bereits erwähnt, erfolgt die Validierung für die richtige Version durch Importieren von ssl und anschließendes Drucken von ssl.OPENSSL_VERSION_INFO. Ich sollte 1.1.1 oder später sehen
Assaf Mendelson

Antworten:

4

Die einzige Möglichkeit, Python 2.7 dazu zu bringen, die aktuelle OpenSSL 1.1.1d-Version für sein sslModul zu verwenden, besteht darin, sie mit dieser OpenSSL-Version neu zu erstellen. Für * nix-Plattformen ist dies nicht zu schwierig. Es werden nur einige anfängliche Konfigurationsdateien angepasst. Ein schneller Test unter macOS zeigte, dass der Python 2.7-Quellcode tatsächlich mit der OpenSSL 1.1.1d-API kompatibel war, sodass dies vielversprechend aussah.

Unter Windows ist es jedoch schwieriger, Python 2.7 mit OpenSSL 1.1.1d neu zu erstellen. Dies liegt daran, dass das Build-System, das auf dem von Microsoft basiert msbuild, nicht so einfach anzupassen ist wie das makeauf * nix basierende Build-System. Sie können die zugehörige Visual Studio-Lösung, Projekte und Eigenschaftendateien im Python- PCbuildUnterverzeichnis anzeigen .

Darüber hinaus sind die Unterschiede zwischen den Versionen OpenSSL 1.0.2 und 1.1.1 unter Windows etwas größer, da sich auch die Bibliotheksnamen geändert haben, während sie für die * nix-Version gleich geblieben sind.

Die erforderlichen Änderungen am Build-System von Python für Windows sind jedoch nicht zu umfangreich. Es sieht so aus, als ob ich das erreichen konnte, wonach Sie suchen, nachdem ich die am Ende dieser Antwort erläuterte Änderung vorgenommen habe. Der eigentliche Build kann mit dem folgenden Befehl ausgeführt werden, der aus dem PCbuildUnterverzeichnis von Python ausgeführt wird :

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

für einen 32-Bit-Build oder

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

für einen 64-Bit-Build. Die --no-Optionen werden verwendet, um den Prozess zu beschleunigen und sich auf den OpenSSL-Aspekt zu konzentrieren. v141steht für Visual Studio 2017, Sie müssen sich in einer Visual Studio-Shell befinden, damit dies funktioniert. Danach wurde im Folgenden Ihr Test reproduziert, der die Verwendung von OpenSSL 1.1.1d mit Python 2.7.17 zeigt:

> 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

Darüber hinaus habe ich keine Tests durchgeführt.


Zusammenfassend umfassen die Änderungen, um dies zu erreichen

  • Das libeayProjekt wurde aus der Lösung entfernt. Dies wurde verwendet, um OpenSSL 1.0.2 aus dem Quellcode zu erstellen, ist jedoch nicht mit OpenSSL 1.1.1 kompatibel. Stattdessen basiert die Lösung jetzt auf den vorgefertigten OpenSSL 1.1.1d-Binärdateien, die vom Python-Repo in cpython-bin-deps bereitgestellt werden . Das Neuerstellen von OpenSSL im Rahmen des Erstellungsprozesses ist möglich, erfordert jedoch weitere Änderungen.
  • Das get_externals.batBatch-Skript wurde geändert , um die vorgefertigten OpenSSL 1.1.1d-Bibliotheken aus dem oben genannten cpython-bin-deps-Repository herunterzuladen.
  • Die openssl.propsEigenschaftendatei, in der mehrere Einstellungen _sslund _hashlibProjekte konfiguriert sind, wurde geändert, und auch an diesen Projekten wurden einige Änderungen vorgenommen. Die Anpassungen stammen hauptsächlich aus der v3.8.1Veröffentlichung von Python, um eine Verknüpfung mit den neuen OpenSSL-Bibliotheken herzustellen und die Include-Pfade korrekt festzulegen. Mit dieser Änderung ist OpenSSL nicht mehr wie in 2.7.17 statisch verknüpft, sondern dynamisch verknüpft.
  • Anwenden von Patches auf die Dateien Modules/posixmodule.cund Modules/timemodule.cähnlich diesem Patch , um das Erstellen mit Visual Studio 2017 zu ermöglichen - dieselbe Version, mit der die vorgefertigten OpenSSL-Binärdateien erstellt wurden.

Übrigens wird im aktuellen Erstellungsprozess mehr Material als nötig heruntergeladen, einschließlich OpenSSL und Nasm-Quellcode. Dies dient nur dazu, möglichst wenige Änderungen an den ursprünglichen Build-Skripten zuzulassen.

Wenn Sie an den Details interessiert sind, können Sie das zugehörige Commit in dieser Abzweigung des Cpython-Repos überprüfen, das ich nur zum Zwecke der Klärung meiner Antwort ausgeführt habe. Es basiert auf dem Original-Tag v2.7.17. Sie sollten in der Lage sein, den Build zu reproduzieren, indem Sie diesen Zweig auschecken v2.7.17_ossl_1.1.1und den Build-Befehl PCbuildwie oben erwähnt ausführen . Wenn genug Leute interessiert sind, kann ich es aufräumen und behalten.

Reinier Torenbeek
quelle