programing tip

비표준 위치에서 SSL 지원으로 Python 빌드

itbloger 2020. 12. 31. 08:02
반응형

비표준 위치에서 SSL 지원으로 Python 빌드


루트 액세스 권한이없는 RHEL에 여러 Python 모듈을 설치해야합니다. 하나 이상의 모듈도에 액세스해야 Python.h합니다.

이 경우 가장 좋은 방법은 Python을 설치하는 것이며 ~/local. 일반적으로 작동하지만 이번에는 Python이 SSL 모듈을 빌드하지 못합니다 (아래 세부 정보 참조). 여기 내가하는 일의 흔적이 있습니다.

그래서 나는 파이썬 6 소스를 다운로드하고 갔다.

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

로그를 검사하면 ssl 모듈이 컴파일되지 않았지만 원인에 대한 언급이 없음을 알 수 있습니다 (make 또는 configure에서 ssl이 다른 발생 없음).

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

그래서 나는 파이썬이 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

Mhhh, 모든 잘못된 곳을 찾고 있습니다. 힌트를 드리려고합니다.

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.

나는 이것을 몇 년 동안 해본 적이 없어서 아마도 나는 무언가를 간과하고있을 것이다. 누구든지 문제를 도울 수 있습니까?

미리 감사드립니다.


Modules/Setup.dist표준 위치가 아닌 경우 OpenSSL의 위치를 ​​지정 하도록 편집해야합니다 . 에서 파이썬 2.5.1에서 SSL 지원 받기 :

httplib.HTTPSConnection 또는 imaplib.IMAP4_SSL과 같은 클라이언트를 사용하기 위해 Python에서 SSL 지원이 필요한 Linux 상자를 사용하는 경우 웹에서 몇 시간 동안 사냥하는 시간을 절약 할 수 있습니다 (물론 이것은 당신이 이미 레벨 사냥을했다는 것을 의미합니다!).

다음 예외 메시지가 표시되면 Python 설치에 컴파일 된 SSL 지원이 필요한지 알 수 있습니다. AttributeError : 'module'object has no attribute 'ssl'

계속해서 즐겁게 파이썬 코드를 슬링 할 수 있도록이를 없애려면 먼저 OpenSSL이 설치되어 있는지 확인해야합니다. 기본적으로 / usr / local / ssl의 소스에서 설치됩니다.

해당 디렉토리가 없으면 소스 패키지를 가져옵니다.

표준 수행 :

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

그런 다음 2.5.1 용 python 소스를 가져오고 : 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실행 하십시오.configuremake


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

모듈이 여전히 잘못된 OpenSSL 버전을 사용 Modules/Setup하기 때문에 저에게는 편집 만으로는 충분하지 않았습니다 _hashlib. 그리고 LD_LIBRARY_PATH내 SLES 시스템에서 실행시에 고려되지 않았다.

What worked was to statically link the local OpenSSL to both _ssl and _hashlib by editing setup.py as per GitHub patch: eddy-geek/ python_custom_openssl.diff, and then make clean && make.

More details on why I used static links on Stack Overflow at Coredump when compiling python with a custom openssl version.


Here is the complete process I used with Python 2.7.11.


In top level Python2.7.11 source dir:

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

    Note: Modules/Setup file does not exist initially but after first run it get's content from Modules/Setup.dist i believe. Make sure changes are reflected in here before every run.

  2. Apply patch: 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
    

I was getting the same result until I got back to the logs for openssl. There I saw that you need to use -fPIC when building openssl: building '_ssl' extension:

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

then, make, make install for openssl and then build Python again.


I have a set of a couple of patches for static openssl and static libintl for 2 and 3 below.

For openssl (first patch) you have to set the env var OPENSSL_ROOT.

This is based on the patch from http://gist.github.com/eddy-geek/9604982 .

For Python 2.7.14:

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

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

For Python 3.6.3:

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

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


I'm building Python2.7.13 and I see this same issue. For 2.7.13 you have to use "openssl1.0.0e" or above to make it work. I tried openssl-0.9.8g and it doesn't work. And somehow I can't make it work just modifying Modules/Setup.dist so I have to manually compile that _ssl.o. I guess this is because openssl-0.9.8g I provided is not working and it searched for system default libssl.so.10 which doesn't work either.


Try adding -Wl,-rpath,/home/fds/rms/local/lib to LDPATH.


For MAC OS HIGH Sierra, and Python-3.5.6 In the above answer the openssl installation is done using source,but if you install using brew it tells where the installed package is, so if you install openssl using brew

brew install openssl

This will install openssl at /usr/local/Cellar/openssl/1.0.2o_2/ this path needs to be updated in Modules/Setup.dist at

Follow this answer which is mentioned above where the location of openssl installation is not mentioned to update the Modules/Setup.dist

In the above lines update SSL value to

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

and uncomment the lines, do a CMM and your python will get compiled with openssl.

ReferenceURL : https://stackoverflow.com/questions/5937337/building-python-with-ssl-support-in-non-standard-location

반응형