Làm cách nào để cài đặt openssl 1.1.1 cho python 2.7?


8

Tôi đã cài đặt python 2.7.17 trên máy Windows 10. Sau đó tôi muốn kiểm tra phiên bản openssl của nó bằng cách chạy phần bên trong python:

import ssl
print ssl.OPENSSL_VERSION_INFO

Tôi nhận được (1, 0, 2, 20, 15) tôi muốn nâng cấp lên phiên bản 1.1.1. Làm pip đóng băng tôi nhận được:

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

Đây dường như là mới nhất trong pip cho pyOpenSSL và mật mã.

Các openssl tôi đã cài đặt (như một phần của git bash) là 1.1.1, tuy nhiên, đây không phải là phiên bản tương tự được sử dụng bên trong python.

Làm cách nào để nâng cấp phiên bản openssl có trong python lên 1.1.1 trở lên?

EDIT: Đáp lại các bình luận, sau đây là kết quả của 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']

Như đã nêu ở trên, mật mã và pyOpenSSL là mới nhất trong pip.


Có bất kỳ lý do rất tốt, tại sao bạn đang sử dụng python2.7? Bởi vì nó không được hỗ trợ nữa và bạn thực sự nên sử dụng python3
Uli Sotschok

@UliSotschok vì ứng dụng sử dụng python này không hỗ trợ python 3 và có lẽ sẽ không bao giờ ...
Assaf Mendelson

Đầu ra của py -m OpenSSL.debugcái gì? Bạn đã thử cập nhật từng mô-đun được liệt kê?
Arn

Những mô-đun nào bạn muốn sử dụng OpenSSL 1.1.1 nhưng chúng không phải là mô-đun ?
CristiFati

@CristiFati ứng dụng tôi đang sử dụng sử dụng pyOpenSSL. Như đã nêu, việc xác thực cho phiên bản phù hợp được thực hiện bằng cách nhập ssl và sau đó in ssl.OPENSSL_VERSION_INFO. Tôi nên xem 1.1.1 trở lên
Assaf Mendelson

Câu trả lời:


4

Cách duy nhất để có được Python 2.7 sử dụng phiên bản OpenSSL 1.1.1d hiện tại cho sslmô-đun của nó là xây dựng lại nó với phiên bản OpenSSL đó. Đối với các nền tảng * nix, điều này không quá khó; nó chỉ liên quan đến việc điều chỉnh một số tập tin cấu hình ban đầu. Một thử nghiệm nhanh trên macOS cho thấy mã nguồn Python 2.7 thực sự tương thích với API OpenSSL 1.1.1d để có vẻ đầy hứa hẹn.

Tuy nhiên, đối với Windows, việc xây dựng lại Python 2.7 bằng OpenSSL 1.1.1d khó hơn. Điều này là do hệ thống xây dựng, phụ thuộc vào Microsoft msbuild, không dễ điều chỉnh như makehệ thống xây dựng dựa trên * nix. Bạn có thể thấy các giải pháp, dự án và tệp thuộc tính củaPCbuild Visual Studio trong thư mục con của Python .

Ngoài ra, sự khác biệt giữa các phiên bản OpenSSL 1.0.2 và 1.1.1 lớn hơn một chút trên Windows, vì tên thư viện cũng đã thay đổi, trong khi chúng vẫn giữ nguyên cho phiên bản * nix.

Các sửa đổi bắt buộc đối với hệ thống xây dựng của Python cho Windows không quá rộng rãi. Có vẻ như tôi đã có thể đạt được những gì bạn đang tìm kiếm, sau khi thực hiện thay đổi được giải thích ở dưới cùng của câu trả lời này. Việc xây dựng thực tế có thể được thực hiện bằng lệnh sau chạy từ PCbuildthư mục con của Python :

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

để xây dựng 32 bit, hoặc

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

để xây dựng 64 bit. Các --no-tùy chọn được sử dụng để tăng tốc quá trình và tập trung vào khía cạnh OpenSSL. v141là viết tắt của Visual Studio 2017, bạn cần phải ở trong vỏ Visual Studio để làm việc này. Sau đó, phần sau đây đã sao chép thử nghiệm của bạn cho thấy việc sử dụng OpenSSL 1.1.1d với 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

Tôi đã không làm bất kỳ thử nghiệm nào ngoài việc này.


Tóm lại, những thay đổi để đạt được điều này bao gồm

  • Loại bỏ libeaydự án khỏi giải pháp. Điều này đã được sử dụng để xây dựng OpenSSL 1.0.2 từ nguồn nhưng nó không tương thích với OpenSSL 1.1.1. Thay vào đó, giải pháp bây giờ dựa vào các nhị phân OpenSSL 1.1.1d dựng sẵn như được cung cấp bởi repo Python trong cpython-bin-deps . Tự xây dựng lại OpenSSL như một phần của quy trình xây dựng là có thể nhưng đòi hỏi phải sửa đổi nhiều hơn.
  • Đã sửa đổi get_externals.battập lệnh bó để tải xuống các thư viện dựng sẵn OpenSSL 1.1.1d từ kho lưu trữ cpython-bin-deps đã nói ở trên.
  • Sửa đổi openssl.propstệp thuộc tính cấu hình một số cài đặt _ssl_hashlibdự án, đồng thời thực hiện một số thay đổi đối với các dự án đó. Các điều chỉnh chủ yếu được lấy từ việc v3.8.1phát hành Python, để liên kết với các thư viện OpenSSL mới và đặt các đường dẫn bao gồm chính xác. Với sửa đổi này, OpenSSL không còn được liên kết tĩnh như trước đây trong 2.7.17, mà được liên kết động.
  • Áp dụng các bản vá cho các tệp Modules/posixmodule.cModules/timemodule.ctương tự như bản vá này , để cho phép xây dựng với Visual Studio 2017 - phiên bản tương tự các nhị phân OpenSSL dựng sẵn được tạo ra.

Nhân tiện, nhiều thứ hơn mức cần thiết được tải xuống trong quá trình xây dựng hiện tại, bao gồm cả mã nguồn OpenSSL và mã nguồn. Điều này chỉ để cho phép càng ít sửa đổi các tập lệnh xây dựng ban đầu càng tốt.

Nếu bạn quan tâm đến các chi tiết, bạn có thể kiểm tra các cam kết liên quan trong ngã ba này của repo cpython mà tôi đã làm chỉ với mục đích làm rõ câu trả lời của tôi. Nó dựa trên thẻ gốc v2.7.17. Bạn sẽ có thể sao chép bản dựng bằng cách kiểm tra nhánh đó v2.7.17_ossl_1.1.1và chạy lệnh xây dựng PCbuildnhư đã đề cập ở trên. Nếu đủ người quan tâm, tôi có thể dọn dẹp và giữ nó xung quanh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.