Сборка Python с поддержкой SSL в нестандартном месте - PullRequest
53 голосов
/ 09 мая 2011

Мне нужно установить несколько модулей Python на RHEL, где у меня нет прав root.По крайней мере, одному из модулей также необходим доступ к Python.h.

. В этом случае я считаю, что лучше всего установить Python и его зависимости в ~/local.Обычно это просто работает, но в этот раз Python не может построить модуль SSL (подробности см. Ниже).Вот след того, что я делаю.

Итак, я скачал исходный код Python 6 и выключил его:

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

Проверка журнала показывает, что модуль ssl не был скомпилирован, ноздесь нет упоминания о причине (нет других случаев использования ssl в make или configure):

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

Итак, я полагаю, python вообще не находит библиотеки ssl (что странно, но эй ...).Поэтому я загружаю openssl-0.9.8r и

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

Теперь вернемся к Python, я ./configure и сделаю снова.Не удается, но на этот раз все по-другому:

Failed to build these modules:
_hashlib           _ssl

Более внимательный анализ файла журнала показывает следующее:

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

Так что теперь она подбирает библиотеку, но не совсем понимает ее правильно(файл там, где должен быть):

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

Следующая вещь - это трассировка make и посмотреть, где он ищет файл:

$ 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

Мххх, он смотрит во всехнеправильные места.Я пытаюсь дать подсказку:

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

Но ничего не меняется, и make, похоже, совсем не пытается /home/fds/rms/local/lib.

Я не делал этого годами,так что, может быть, я что-то упускаю.Кто-нибудь может помочь с проблемой?

Заранее спасибо.

Ответы [ 9 ]

59 голосов
/ 09 мая 2011

Вам необходимо отредактировать Modules/Setup.dist, чтобы указать расположение OpenSSL, если оно не находится в стандартном расположении. От Получение поддержки SSL в Python 2.5.1 :

Если вы оказались на Linux, нуждающемся в поддержке ssl на python (для использовать клиента в таких вещах, как httplib.HTTPSConnection или imaplib.IMAP4_SSL), тогда позвольте мне сэкономить вам пару часов охоты по сети (конечно, если вы нашли это, то это означает, Вы уже провели некоторый уровень охоты!).

Вы узнаете, нужна ли вам поддержка ssl, скомпилированная в ваш питон установка, если вы получите следующее сообщение об исключении: AttributeError: у объекта 'module' нет атрибута 'ssl'

Для того, чтобы это прошло, чтобы вы могли продолжать счастливо код Python, вам нужно сначала убедиться, что у вас есть OpenSSL установлены. По умолчанию он устанавливается из источника по адресу: / usr / local / ssl

Если этот каталог не существует, тогда захватите пакет с исходным кодом.

У стандарта:

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

Затем возьмите исходники Python для 2.5.1 и: tar zxf Python-2.5.1.tgz && cd Python-2.5.1

Затем вам нужно отредактировать 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

Если вы установили OpenSSL в каталогах по умолчанию, вы можете просто раскомментируйте строки 206-209, затем:

./configure
make
make install

Затем проверьте вашу установку с помощью:

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

Убедитесь, что изменения в Modules/Setup.dist получены путем очистки исходного корня (например, make distclean) и снова запустите configure и make.

6 голосов
/ 18 ноября 2011

в оболочке Bourne (/ bin / sh или / bin / bash):

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

в оболочке C (/ bin / csh или / bin / tcsh):

% setenv LD_LIBRARY_PATH /usr/local/lib
% make
4 голосов
/ 17 марта 2014

Для меня редактирования Modules/Setup было недостаточно, так как модуль _hashlib по-прежнему использовал неправильную версию OpenSSL; и LD_LIBRARY_PATH не было учтено во время выполнения в моей системе SLES.

Что работало, так это статически связывать локальный OpenSSL с _ssl и _hashlib путем редактирования setup.py согласно патчу GitHub: eddy-geek / python_custom_openssl.diff , а затем make clean && make .

Подробнее о том, почему я использовал статические ссылки при переполнении стека в Coredump при компиляции python с пользовательской версией openssl .

3 голосов
/ 05 марта 2016

Вот полный процесс, который я использовал с Python 2.7.11.


В исходном каталоге Python2.7.11 верхнего уровня:

  1. Изменение Modules/Setup.dist, Modules/Setup: раскомментируйте раздел _ssl, закомментируйте _socket (нет, если он уже закомментирован), раскомментируйте и установите соответствующий SSL (путь к вашему новому ssl lib/includes и т. Д.)

    Примечание. Файл Modules / Setup изначально не существует, но после первого запуска он получает содержимое из Modules / Setup.dist.Перед каждым запуском убедитесь, что изменения отражены здесь.

  2. Применить исправление: http://gist.github.com/eddy-geek/9604982 (сделать distclean, если ранее выполнено, сделать)

    ./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared
    
    # modify: Makefile -> set svnversion to ""
    
    make
    
    make altinstall
    
2 голосов
/ 17 ноября 2017

У меня есть пара патчей для статического openssl и статического libintl для 2 и 3 ниже.

Для openssl (первый патч) вы должны установить env var OPENSSL_ROOT.

Это основано на патче от http://gist.github.com/eddy-geek/9604982.

Для Python 2.7.14:

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

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

Для Python 3.6.3:

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

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

2 голосов
/ 21 сентября 2015

Я получал тот же результат, пока не вернулся к логам openssl. Там я увидел, что вам нужно использовать -fPIC при сборке openssl: расширение здания '_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

затем make, make install для openssl и затем сборка Python снова.

1 голос
/ 26 мая 2017

Я собираю Python2.7.13 и вижу эту же проблему. Для 2.7.13 вы должны использовать "openssl1.0.0e" или выше, чтобы он работал. Я попробовал openssl-0.9.8g, и он не работает. И почему-то я не могу заставить его работать, просто изменяя Modules / Setup.dist, поэтому мне нужно вручную скомпилировать этот _ssl.o. Я предполагаю, что это потому, что предоставленный мною openssl-0.9.8g не работает, и он искал системный файл по умолчанию libssl.so.10, который тоже не работает.

0 голосов
/ 09 ноября 2018

Для MAC OS HIGH Sierra , и Python-3.5.6 В приведенном выше ответе установка openssl выполняется с использованием исходного кода, но если вы устанавливаете с использованием brew, он сообщает, где находится установленный пакет, поэтому, если вы устанавливаете openssl с помощью brew

brew install openssl

Это установит openssl в / usr / local / Cellar / openssl / 1.0.2o_2 / этот путь необходимо обновить в Modules / Setup.dist на

Следуйте этому ответу, который упоминался выше, где не упоминается место установки openssl для обновления модуля / Setup.dist

В приведенных выше строках обновите значение SSL до

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

и раскомментируйте строки, сделайте CMM, и ваш питон будет скомпилирован с openssl.

0 голосов
/ 09 мая 2011

Попробуйте добавить -Wl,-rpath,/home/fds/rms/local/lib к LDPATH.

...