python openssl compilation

Construyendo Python con soporte SSL en una ubicación no estándar



openssl compilation (8)

Estaba obteniendo el mismo resultado hasta que volví a los registros de openssl. Ahí vi que necesitas usar -fPIC al construir la extensión openssl: building ''_ssl'':

gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/ssl/include -I. -IInclude -I./Include -I/usr/local/include -I/home/feramos/Python-2.7.3/Include -I/home/feramos/Python-2.7.3 -c /home/feramos/Python-2.7.3/Modules/_ssl.c -o build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o gcc -pthread -shared build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o -L/usr/local/ssl/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.7/_ssl.so /usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup'' can not be used when making a shared object; recompile with -fPIC openssl-0.9.8g]# .config -fPIC

luego, make, make install para openssl y luego compila Python nuevamente.

Necesito instalar varios módulos de Python en un RHEL donde no tengo acceso de root. Al menos uno de los módulos también necesita acceso a Python.h .

En este caso, creo que lo mejor es instalar python y sus dependencias en ~/local . Por lo general, solo funciona, pero esta vez Python no puede construir el módulo SSL (ver detalles a continuación). Aquí está el rastro de lo que estoy haciendo.

Así que descargué la fuente de python 6 y me fui:

./configure --prefix=/home/fds/rms/local make >& make.log

Una inspección al registro revela que el módulo ssl no se ha compilado, pero no se menciona la causa (ninguna otra ocurrencia de ssl en make o configure):

Failed to find the necessary bits to build these modules: _bsddb _curses _curses_panel _hashlib _sqlite3 _ssl <----------

Entonces me imagino que Python no está encontrando ninguna biblioteca ssl en absoluto (lo cual es extraño, pero bueno ...). Así que descargué openssl-0.9.8r y

./config --prefix=/home/fds/rms/local shared make make install

Ahora de regreso a Python, configuro ./configure y vuelvo a hacer. No funciona, pero esta vez es diferente:

Failed to build these modules: _hashlib _ssl

Una inspección más cercana al archivo de registro revela esto:

gcc -pthread -shared build/temp.linux-x86_64-2.6/home/fds/rms/installers/Python-2.6.6/Modules/_ssl.o -L/home/fds/rms/local/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.6/_ssl.so *** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory

Así que ahora está recogiendo la biblioteca pero no acaba de hacerlo bien (el archivo está allí donde debe estar):

$ find /home/fds/rms/local -iname libssl.so.0.9.8 /home/fds/rms/local/lib/libssl.so.0.9.8

Lo siguiente es rastrear hacer y ver dónde está buscando el archivo:

$ strace -f make 2>&1 | grep libssl.so.0.9.8 [pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] write(1, "*** WARNING: renaming /"_ssl/" sin"..., 131*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory [pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 5584] write(1, "*** WARNING: renaming /"_hashlib/""..., 135*** WARNING: renaming "_hashlib" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory

Mhhh, está buscando en todos los lugares equivocados. Intento dar una pista:

CPPFLAGS="-I/home/fds/rms/local/include -I/home/fds/rms/local/include/openssl" LDFLAGS="-L/home/fds/rms/local/lib" ./configure --prefix=/home/fds/rms/local

Pero nada cambia, y make no parece probar /home/fds/rms/local/lib en absoluto.

No he hecho esto en años, así que tal vez estoy pasando por alto algo. ¿Alguien puede ayudar con el problema?

Gracias por adelantado.


Este es el proceso completo que utilicé con Python 2.7.11.

En el directorio de origen Python2.7.11 de nivel superior:

  1. Cambiar Modules/Setup.dist , Modules/Setup : _ssl sección, comentar _socket (no- _socket si ya está comentada), descomentar y establecer SSL de manera apropiada (ruta a su nueva biblioteca ssl lib/includes etc.)

    Nota: El archivo de módulos / instalación no existe inicialmente, pero después de la primera ejecución obtiene el contenido de Modules / Setup.dist, creo. Asegúrese de que los cambios se reflejen aquí antes de cada ejecución.

  2. Aplique el parche: http://gist.github.com/eddy-geek/9604982 (make distclean si ejecutó anteriormente make)

    ./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared # modify: Makefile -> set svnversion to "" make make altinstall


Estoy compilando Python2.7.13 y veo este mismo problema. Para 2.7.13, debe usar "openssl1.0.0e" o superior para que funcione. Intenté openssl-0.9.8g y no funciona. Y de alguna manera no puedo hacer que funcione solo modificando Modules / Setup.dist, así que tengo que compilar manualmente _ssl.o. Supongo que esto se debe a que openssl-0.9.8g que proporcioné no funciona y buscó el sistema libssl.so.10 predeterminado, que tampoco funciona.


Intente agregar -Wl,-rpath,/home/fds/rms/local/lib a LDPATH .


Necesita editar Modules/Setup.dist para especificar la ubicación de OpenSSL si no está en la ubicación estándar. Obtenga el soporte SSL en Python 2.5.1 :

Si te encuentras en una caja de linux que necesita soporte para ssl en python (para usar un cliente en cosas como httplib.HTTPSConnection o imaplib.IMAP4_SSL), entonces permíteme ahorrarte un par de horas de búsqueda por la web (por supuesto si tienes encontrado esto, eso significa que ya has hecho un poco de caza de nivel!).

Sabrá si necesita soporte SSL compilado en su instalación de python si recibe el siguiente mensaje de excepción: AttributeError: el objeto ''module'' no tiene atributo ''ssl''

Para que esto desaparezca y pueda continuar lanzando felizmente el código python, primero deberá asegurarse de tener instalado OpenSSL. Por defecto, se instala desde la fuente en: / usr / local / ssl

Si ese directorio no existe, entonces tome el paquete fuente.

Hacer el estándar:

tar zxf openssl-0.9.8g.tar.gz cd openssl-0.9.8g ./config make make install

A continuación, tome las fuentes de Python para 2.5.1 y: tar zxf Python-2.5.1.tgz && cd Python-2.5.1

Luego necesita editar los Módulos / Configuración.dist:

204:# Socket module helper for SSL support; you must comment out the other 205:# socket line above, and possibly edit the SSL variable: 206:SSL=/usr/local/ssl 207:_ssl _ssl.c / 208: -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl / 209: -L$(SSL)/lib -lssl -lcrypto

Si instaló OpenSSL en las ubicaciones predeterminadas, puede descomentar las líneas 206-209, luego:

./configure make make install

Luego verifica tu instalación con:

python /usr/local/lib/python2.5/test/test_socket_ssl.py test_rude_shutdown ... test_basic ... test_timeout ...


Para mí, la edición de Modules/Setup no fue suficiente ya que el módulo _hashlib aún terminaba usando una versión de OpenSSL incorrecta; y LD_LIBRARY_PATH no se tuvo en cuenta en el tiempo de ejecución en mi sistema SLES.

Lo que funcionó fue vincular estáticamente el OpenSSL local a _ssl y _hashlib editando setup.py según el parche GitHub: eddy-geek / python_custom_openssl.diff , y luego make clean && make .

Más detalles sobre por qué utilicé enlaces estáticos en en Coredump al compilar Python con una versión de openssl personalizada .


Tengo un par de parches para openssl estático y libintl estático para 2 y 3 a continuación.

Para openssl (primer parche), debe configurar el env var OPENSSL_ROOT.

Esto se basa en el parche de http://gist.github.com/eddy-geek/9604982 .

Para Python 2.7.14:

https://gist.github.com/rkitover/2d9e5baff1f1cc4f2618dee53083bd35

https://gist.github.com/rkitover/afab7ed3ac7ce1860c43a258571c8ae1

Para Python 3.6.3:

https://gist.github.com/rkitover/93d89a679705875c59275fb0a8f22b45

https://gist.github.com/rkitover/b18f19eafda3775a9652cc9cdf3ec914


en el shell de Bourne (/ bin / sh o / bin / bash):

$ LD_LIBRARY_PATH=/usr/local/lib $ export LD_LIBRARY_PATH $ make

en el C-shell (/ bin / csh o / bin / tcsh):

% setenv LD_LIBRARY_PATH /usr/local/lib % make