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
.
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 ...
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
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 .
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:
-
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 ssllib/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.
-
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
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
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.
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.
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
.
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