Budowanie Pythona z obsługą SSL w niestandardowej lokalizacji

Muszę zainstalować kilka modułów Pythona na RHEL, gdzie nie mam dostępu do roota. Co najmniej jeden z modułów wymaga również dostępu do Python.h.

W tym przypadku uważam, że najlepiej zainstalować Pythona i to w ~/local. Zazwyczaj po prostu działa, ale tym razem Python nie zbuduje modułu SSL(patrz szczegóły poniżej). Oto ślad tego, co robię.

Więc ściągnąłem źródło Pythona 6 i wyłączyłem:

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

Inspekcja do dziennika ujawnia ten moduł ssl nie został skompilowany, ale nie ma wzmianki o przyczynie (nie ma innego wystąpienia ssl W make lub configure):

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

Więc pomyślałem, python nie znajduje żadnej biblioteki ssl w ogóle (co jest dziwne, ale hej...). Więc ściągam openssl-0.9.8 r i

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

A teraz powrót do Pythona, I ./ configure and make again. Zawiedzie, ale tym razem jest inaczej:

Failed to build these modules:
_hashlib           _ssl

Bliższa Kontrola pliku dziennika ujawnia to:

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

Więc teraz podnosi się biblioteka, ale nie do końca dobrze (plik jest tam, gdzie powinien być):

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

Następną rzeczą jest śledzenie make i zobacz gdzie szuka pliku:

$ 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, szuka w niewłaściwych miejscach. Staram się podpowiedzieć:

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

Ale nic się nie zmienia, i make wydaje się, że w ogóle nie próbuje /home/fds/rms/local/lib.

Nie robiłem tego od lat, więc może coś przeoczyłem. Czy ktoś może pomóc z problemem? Z góry dzięki.
Author: jww, 2011-05-09

8 answers

Musisz edytować Modules/Setup.dist Aby określić lokalizację OpenSSL, jeśli nie znajduje się ona w standardowej lokalizacji. Od uzyskanie obsługi SSL w Pythonie 2.5.1:

Jeśli znajdziesz się na Linuksie potrzebującym obsługi ssl w Pythonie (do użyj klienta w rzeczach takich jak httplib.HTTPSConnection lub imaplib.IMAP4_SSL), to oszczędzę Ci kilka godzin polowania wokół sieci (oczywiście jeśli to znalazłeś to znaczy już trochę polowałeś!).

Dowiesz się, czy potrzebujesz wsparcia ssl skompilowanego do Pythona Instalacja, Jeśli pojawi się następujący komunikat o wyjątku: AttributeError:' module 'obiekt nie ma atrybutu' ssl '

Aby to zniknęło, abyś mógł kontynuować szczęśliwe ślizganie się kod Pythona, musisz najpierw upewnić się, że masz OpenSSL zainstalowany. Domyślnie jest instalowany ze źródła pod adresem: / usr / local / ssl

Jeśli ten katalog nie istnieje, pobierz pakiet źródłowy.

Do standard:

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

Następnie pobierz źródła Pythona dla 2.5.1 i: Tar Zxf Python-2.5.1.tgz && cd Python-2.5.1

Następnie musisz edytować Moduły / konfigurację.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

Jeśli zainstalowałeś OpenSSL w domyślnych lokalizacjach, możesz po prostu uncomment lines 206-209, then:

./configure
make
make install

Następnie sprawdź swoją instalację za pomocą:

python /usr/local/lib/python2.5/test/test_socket_ssl.py
test_rude_shutdown ...
test_basic ...
test_timeout ...
 50
Author: Cosmin Stejerean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 23:34:16

W powłoce Bourne ' a (/bin /sh lub/bin / bash):

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

W powłoce C (/bin /csh lub/bin / tcsh):

% setenv LD_LIBRARY_PATH /usr/local/lib
% make
 5
Author: Soli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 09:18:04

Dla mnie edycja Modules/Setup nie wystarczyła, ponieważ _hashlib moduł nadal kończył się używaniem złej wersji OpenSSL; a LD_LIBRARY_PATH nie był brany pod uwagę podczas uruchamiania w moim systemie SLES.

Zadziałało statyczne połączenie lokalnego OpenSSL z _ssl i _hashlib poprzez edycję setup.py zgodnie z łatka GitHub: eddy-geek/ python_custom_openssl.diff , a następnie make clean && make.

Więcej szczegółów na temat tego, dlaczego użyłem statycznych linków na przepełnieniu stosu w Coredump podczas kompilacji Pythona z niestandardowym OpenSSL Wersja .

 4
Author: eddygeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:10

Oto kompletny proces, którego użyłem w Pythonie 2.7.11.


Na najwyższym poziomie Python2.7. 11 źródło dir:

  1. Zmień Modules/Setup.dist, Modules/Setup : Uncomment _ssl section, comment out _socket (no-op if it ' s already commented out), uncomment and set SSL appropriate (path to your new ssl lib/includes etc.)

    Uwaga: plik Modules / Setup początkowo nie istnieje, ale po pierwszym uruchomieniu pobiera zawartość z Modules / Setup.dist I believe. Upewnij się, że zmiany zostaną odzwierciedlone tutaj przed każdy bieg.

  2. Zastosuj plaster: http://gist.github.com/eddy-geek/9604982 (make distclean if previously ran make)

    ./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared
    
    # modify: Makefile -> set svnversion to ""
    
    make
    
    make altinstall
    
 3
Author: aks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 04:31:43

Mam zestaw kilku łatek dla statycznego openssl i statycznego libintl dla 2 i 3 poniżej.

Dla openssl (pierwsza łata) musisz ustawić ENV var OPENSSL_ROOT.

Jest to oparte na łatce z http://gist.github.com/eddy-geek/9604982 .

Dla Pythona 2.7.14:

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

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

Dla Python 3.6.3:

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

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

 2
Author: Rafael Kitover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-25 14:39:49

Otrzymywałem ten sam wynik, dopóki nie wróciłem do logów OpenSSL. Tam zobaczyłem, że trzeba użyć-fPIC przy budowaniu openssl: rozszerzenie budynku "_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

Następnie, make, make install dla openssl, a następnie ponownie zbudować Pythona.

 1
Author: ferchor2003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-20 21:51:43

Buduję Python2. 7. 13 i widzę ten sam problem. W wersji 2.7.13 musisz użyć "openssl1.0.0 e" lub wyższej, aby to działało. Próbowałem openssl-0.9.8 g i nie działa. I jakoś nie mogę tego zrobić tylko modyfikując Moduły / konfigurację.dist więc muszę ręcznie skompilować ten _ssl.o. Myślę, że to dlatego, że OpenSSL-0.9.8 g podałem nie działa i szukał domyślnego systemu libssl. so. 10, który również nie działa.

 1
Author: user2189731,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 02:39:00

Spróbuj dodać -Wl,-rpath,/home/fds/rms/local/lib do LDPATH.

 0
Author: Pär Wieslander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 14:18:42