SSL со старой версией Python (2.7.3) во FreeBSD - PullRequest
0 голосов
/ 11 апреля 2019

Я установил старую версию Python (2.7.3) из исходного кода в каталог (не как системный python по умолчанию), чтобы иметь возможность иногда запускать старое приложение.Я хотел бы настроить эту среду с помощью pip или easy_install, но это не работает, поскольку требуется SSL, и я не могу собрать эту версию с помощью ssl.Сборка работает, но я получаю сообщение

Failed to build these modules:
_ctypes            _hashlib           _ssl

OpenSSL установлен (это машина с FreeBSD).Сборка Python 2.7.15 из исходного кода работает, и эти модули устанавливаются.

Я предполагаю, что 2.7.3 может потребоваться более старая версия OpenSSL (у меня установлена ​​1.1.1a-freebsd).

Как я могу собрать эту версию Python с включенным SSL?(Мне удалось установить setuptools, но я не могу использовать их без SSL)

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Патчи для Python 2.7 для сборки с более новым OpenSSL:

--- Modules/_ssl.c.orig 2018-03-05 01:25:37.803984781 +0300
+++ Modules/_ssl.c  2018-03-05 01:25:04.499198913 +0300
@@ -300,8 +300,10 @@
     PySSL_BEGIN_ALLOW_THREADS
     if (proto_version == PY_SSL_VERSION_TLS1)
         self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
+#ifndef OPENSSL_NO_SSL3
     else if (proto_version == PY_SSL_VERSION_SSL3)
         self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
+#endif
 #ifndef OPENSSL_NO_SSL2
     else if (proto_version == PY_SSL_VERSION_SSL2)
         self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */

--- Lib/ssl.py.orig 2017-09-19 10:32:02.000000000 +0300
+++ Lib/ssl.py  2018-03-05 01:38:26.358119752 +0300
@@ -91,14 +91,13 @@
     SSL_ERROR_INVALID_ERROR_CODE,
     )
 from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN
-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23,
+from _ssl import (PROTOCOL_SSLv23,
                   PROTOCOL_TLSv1)
 from _ssl import _OPENSSL_API_VERSION

 _PROTOCOL_NAMES = {
     PROTOCOL_TLSv1: "TLSv1",
     PROTOCOL_SSLv23: "SSLv23",
-    PROTOCOL_SSLv3: "SSLv3",
 }
 try:
     from _ssl import PROTOCOL_SSLv2
@@ -664,7 +663,7 @@
     d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
     return base64.decodebytes(d.encode('ASCII', 'strict'))

-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None):
+def get_server_certificate(addr, ssl_version=PROTOCOL_TLSv1, ca_certs=None):
     """Retrieve the certificate from the server at the specified address,
     and return it as a PEM-encoded string.
     If 'ca_certs' is specified, validate the server cert against it.

Я скомпилировал Python 2.7.10 с OpenSSL 1.1.0j под Debian 9.

0 голосов
/ 12 апреля 2019

И python27, и python36 могут быть установлены из портов и пакетов (см. Ниже, включая зависимости).Я думаю, что проблема заключается в смешивании pip с портами и пакетами freebsd.Попробуйте чистую установку и "pkg install python27 python36".

# pkg info | grep python
py27-asn1crypto-0.22.0         ASN.1 library with a focus on performance and a 
pythonic API
py27-requests-toolbelt-0.8.0   Utility belt for advanced users of python-requests
py36-asn1crypto-0.22.0         ASN.1 library with a focus on performance and a 
pythonic API
py36-requests-toolbelt-0.8.0   Utility belt for advanced users of python-requests
python27-2.7.16                Interpreted object-oriented programming language
python36-3.6.8_1               Interpreted object-oriented programming language

# pkg info -dx python27
python27-2.7.16:
    openssl-1.0.2r,1
    readline-7.0.5
    libffi-3.2.1_3
...