Construire Python avec le support SSL dans un emplacement non standard

j'ai besoin d'installer plusieurs modules Python sur un RHEL où je n'ai pas d'accès root. Au moins un des modules doit aussi avoir accès à Python.h .

Dans ce cas, je trouve que la meilleure chose à faire est d'installer python et dépendances ~/local . Cela ne fait généralement que fonctionner, mais cette fois Python ne parvient pas à construire le module SSL (voir les détails ci-dessous). Voici la trace de ce que je fais.

donc j'ai téléchargé python 6 source et off I

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

une inspection à log révèle que le module ssl n'a pas été compilé, mais il n'y a aucune mention de la cause (aucune autre occurrence de ssl dans make ou configure):

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

donc je me suis dit, python ne trouve aucune bibliothèque ssl du tout (ce qui est étrange, mais hey...). Donc je télécharge openssl-0.9.8 r et

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

maintenant retour à Python, I./configurer et faire à nouveau. Il échoue, mais, cette fois, c'est différent:

Failed to build these modules:
_hashlib           _ssl

un examen plus attentif du fichier journal révèle ceci:

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

donc maintenant il est ramasser la bibliothèque mais pas tout à fait à droite (le fichier est là où est devrait être):

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

la prochaine chose est de tracer la marque et voir où est-ce qu'il cherche le fichier:

$ 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, il regarde dans tous les mauvais endroits. J'essaie de donner un indice:

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

mais rien ne change, et make ne semble pas essayer /home/fds/rms/local/lib du tout.

Je n'ai pas fait ça depuis des années, donc peut-être que j'oublie quelque chose. N'importe qui peut aider avec ce problème?

Merci d'avance.

46
demandé sur jww 2011-05-09 17:10:47

8 réponses

vous devez éditer Modules/Setup.dist pour spécifier L'emplacement D'OpenSSL si elle n'est pas dans l'emplacement standard. De obtenir le Support SSL en Python 2.5.1 :

si vous vous trouvez sur une machine linux ayant besoin du support ssl en python (pour utiliser un client dans des choses comme httplib.HTTPSConnection ou imaplib.IMAP4_SSL), alors laissez - moi vous épargner quelques heures de chasse autour du web (bien sûr, si vous avez trouvé ce qui signifie tu as déjà fait de la chasse au niveau!).

vous saurez si vous avez besoin du support ssl compilé dans votre python installation si vous recevez le message d'exception suivant: AttributeError: l'objet 'module' n'a pas d'attribut 'ssl'

pour que tu puisses continuer à t'élancer code python, vous devez d'abord vous assurer que vous avez OpenSSL installer. Par défaut, il est installé à partir de la source: / usr / local / ssl

si ce répertoire n'existe pas, saisissez le paquet source.

Ne le standard:

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

puis saisissez les sources python pour 2.5.1 et: tar zxf Python-2.5.1.tgz && cd Python-2.5.1

ensuite, vous devez éditer les Modules/Setup.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 vous avez installé OpenSSL dans les emplacements par défaut, vous pouvez juste lignes 206-209, puis:

./configure
make
make install

vérifiez ensuite votre installation avec:

python /usr/local/lib/python2.5/test/test_socket_ssl.py
test_rude_shutdown ...
test_basic ...
test_timeout ...
50
répondu Cosmin Stejerean 2016-02-18 23:34:16

dans le Bourne shell (/bin/sh ou /bin/bash):

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

dans le réservoir en C (/bin /csh ou/bin / tcsh):

% setenv LD_LIBRARY_PATH /usr/local/lib
% make
5
répondu Soli 2011-11-18 09:18:04

pour moi éditant Modules/Setup n'était pas suffisant car le module _hashlib a fini par utiliser la mauvaise version D'OpenSSL; et LD_LIBRARY_PATH n'a pas été pris en compte lors de l'exécution sur mon système SLES.

ce qui a fonctionné était de lier statiquement L'OpenSSL local à la fois _ssl et _hashlib en éditant setup.py comme dans patch GitHub: eddy-geek/ python_custom_openssl.diff , puis make clean && make .

plus détails sur la raison pour laquelle j'ai utilisé des liens statiques sur le débordement de la pile à Coredump lors de la compilation de python avec une version openssl personnalisée .

4
répondu eddygeek 2017-05-23 12:26:10

voici le processus complet que j'ai utilisé avec Python 2.7.11.


in top level Python2.7.Source dir:

  1. Changement Modules/Setup.dist , Modules/Setup : Commentaire "151930920 de la section" commentaire _socket (no-op si c'est déjà commenté), décommentez et configurer SSL de manière appropriée (chemin d'accès à votre nouveau ssl lib/includes etc.)

    Note: le fichier Modules/Setup N'existe pas au début, mais après la première exécution, il obtient le contenu des Modules / Setup.dist je crois. Assurez-vous que les changements sont reflétés ici avant chaque course.

  2. appliquer le correctif: http://gist.github.com/eddy-geek/9604982 (make distclean si, auparavant, a couru faire)

    ./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared
    
    # modify: Makefile -> set svnversion to ""
    
    make
    
    make altinstall
    
3
répondu aks 2016-09-02 04:31:43

j'ai un ensemble de deux patches pour static openssl et static libintl pour 2 et 3 ci-dessous.

pour openssl (premier patch), vous devez définir L'OPENSSL_ROOT env var.

basé sur le patch de http://gist.github.com/eddy-geek/9604982 .

Pour Python 2.7.14:

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

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

Pour Python 3.6.3:

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

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

2
répondu Rafael Kitover 2017-11-25 14:39:49

j'obtenais le même résultat jusqu'à ce que je revienne aux logs pour openssl. Là j'ai vu que vous devez utiliser-fPIC lors de la construction openssl: extension du bâtiment "_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

puis, make, make install pour openssl et puis build Python à nouveau.

1
répondu ferchor2003 2015-12-20 21:51:43

je construis Python2.7.13 et je vois cette même question. Pour 2.7.13 vous devez utiliser " openssl1.0.0 E" ou plus pour que ça marche. J'ai essayé openssl-0.9.8 g et ça ne marche pas. Et d'une façon ou d'une autre, je ne peux pas le faire fonctionner en modifiant les Modules/la configuration.dist donc je dois compiler manuellement ce _ssl.o. Je suppose que c'est parce qu'openssl-0.9.8 g que j'ai fourni ne fonctionne pas et qu'il a cherché libssl par défaut.alors?10 ce qui ne marche pas non plus.

1
répondu user2189731 2017-05-26 02:39:00

essayez d'ajouter -Wl,-rpath,/home/fds/rms/local/lib à LDPATH .

0
répondu Pär Wieslander 2011-05-09 14:18:42