web-dev-qa-db-fra.com

Construire Python avec support SSL dans un emplacement non standard

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

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

J'ai donc téléchargé le code source de Python 6 et je suis parti:

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

Une inspection à enregistrer révèle que le module ssl n’a pas été compilé, mais la cause n’en est pas mentionnée (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   <----------

Je pense donc que python ne trouve pas du tout de bibliothèque ssl (ce qui est étrange, mais bon ...). Donc, je télécharge openssl-0.9.8r et

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

Maintenant, revenons à Python, je ./configure et fais à nouveau. Cela échoue, mais cette fois, c'est différent:

Failed to build these modules:
_hashlib           _ssl

Une inspection plus minutieuse 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

Alors maintenant, c'est récupérer la bibliothèque mais pas tout à fait correctement (le fichier est là où il 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 à faire est de tracer la marque et de voir où elle 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 cherche 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 ne l'ai pas fait depuis des années, alors peut-être que je néglige quelque chose. Quelqu'un peut-il aider avec le problème?

Merci d'avance.

50
Matteo Caprari

Vous devez modifier Modules/Setup.dist pour spécifier l'emplacement d'OpenSSL s'il ne se trouve pas à l'emplacement standard. De Obtenir la prise en charge de SSL dans 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 telles que httplib.HTTPSConnection ou Imaplib.IMAP4_SSL), laissez-moi vous épargner quelques heures de chasse. sur le Web (bien sûr, si vous avez trouvé cela, cela signifie que vous avez déjà fait une recherche de niveau!).

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

Pour que cela disparaisse afin que vous puissiez continuer à rouler avec bonheur code python, vous devez d’abord vous assurer que vous avez bien OpenSSL installée. Par défaut, il est installé depuis le source à l’adresse:/usr/local/ssl

Si ce répertoire n'existe pas, récupérez le paquet source.

Faire la norme:

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

Ensuite, récupérez les sources python pour 2.5.1 et: tar zxf Python-2.5.1.tgz && cd Python-2.5.1

Ensuite, vous devez éditer le module/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 aux emplacements par défaut, vous pouvez simplement lignes de commentaire 200-209, puis:

./configure
make
make install

Puis vérifiez votre installation avec:

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

Assurez-vous que les modifications apportées à Modules/Setup.dist sont prises en nettoyant la racine source (par exemple, make distclean) et exécutez à nouveau configure et make.

52

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

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

dans le C-Shell (/ bin/csh ou/bin/tcsh):

% setenv LD_LIBRARY_PATH /usr/local/lib
% make
6
Soli

Pour moi, éditer Modules/Setup n'était pas suffisant car le module _hashlib finissait toujours par utiliser la mauvaise version d'OpenSSL; et LD_LIBRARY_PATH n'a pas été pris en compte au moment de l'exécution sur mon système SLES.

Ce qui a bien fonctionné a été de lier statiquement OpenSSL local à _ssl et _hashlib en modifiant setup.py conformément à patch GitHub: eddy-geek/python_custom_openssl.diff , puis make clean && make.

Plus de détails sur les raisons pour lesquelles j’ai utilisé des liens statiques sur Stack Overflow dans Coredump lors de la compilation de python avec une version openssl personnalisée .

4
eddygeek

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


Dans le répertoire source Python2.7.11 de niveau supérieur:

  1. Modifiez Modules/Setup.dist, Modules/Setup: Décommentez la section _ssl, mettez en commentaire _socket (non-op s'il est déjà mis en commentaire), décommentez et définissez SSL de manière appropriée (chemin d'accès vers votre nouveau ssl lib/includes, etc.).

    Remarque: Le fichier Modules/Setup n'existe pas initialement, mais après la première exécution, il obtient le contenu de Modules/Setup.dist i crois. Assurez-vous que les modifications sont reflétées ici avant chaque exécution.

  2. Appliquer le correctif: http://Gist.github.com/eddy-geek/9604982 (Make distclean s'il a déjà été lancé make)

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

J'ai un ensemble de quelques correctifs pour OpenSL statique et libintl statique pour 2 et 3 ci-dessous.

Pour openssl (premier correctif), vous devez définir la variable env OPENSSL_ROOT.

Ceci est basé sur le correctif 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
Rafael Kitover

J'obtenais le même résultat jusqu'à ce que je revienne dans les journaux pour openssl . Là, j'ai vu qu'il fallait utiliser -fPIC lors de la construction de openssl:

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, puis compilez à nouveau Python.

2
ferchor2003

Je construis Python2.7.13 et je vois le même problème. Pour 2.7.13, vous devez utiliser "openssl1.0.0e" ou une version ultérieure pour que cela fonctionne. J'ai essayé openssl-0.9.8g et cela ne marche pas ... et je ne peux pas le faire fonctionner en modifiant simplement Modules/Setup.dist, je dois donc compiler manuellement ce fichier _ssl.o . est parce que openssl-0.9.8g que j’ai fourni ne fonctionne pas et qu’il a recherché libssl.so.10 par défaut du système, ce qui ne fonctionne pas non plus.

1
user2189731

Pour MAC OS High Sierra , et Python-3.5.6 Dans la réponse ci-dessus, l’installation de openssl est réalisée à l’aide de source, mais si vous installez à l’aide de brew, il indique où se trouve le paquet installé, donc si vous installez openssl en utilisant brew

brew install openssl

Ceci installera openssl à /usr/local/Cellar/openssl/1.0.2o_2/ ce chemin doit être mis à jour dans Modules/Setup.dist à

Suivez cette réponse mentionnée ci-dessus lorsque l'emplacement d'installation d'OpenSL n'est pas mentionné pour mettre à jour Modules/Setup.dist

Dans les lignes ci-dessus, mettez à jour la valeur SSL pour

SSL=/usr/local/Cellar/openssl/1.0.2o_2/

et décommentez les lignes, faites un CMM et votre python sera compilé avec openssl.

0
H S Rathore

Essayez d’ajouter -Wl,-rpath,/home/fds/rms/local/lib à LDPATH.

0
Pär Wieslander