web-dev-qa-db-ja.com

Python非標準の場所でのSSLサポート付き)

ルートアクセス権がないRHELにいくつかのPythonモジュールをインストールする必要があります。モジュールの少なくとも1つは、Python.hへのアクセスも必要です。

この場合、pythonとその依存関係を~/localにインストールすることが最善であることがわかりました。通常は正常に機能しますが、今回はPythonがSSLモジュールの構築に失敗します(以下の詳細を参照)。ここに私がやっていることの痕跡があります。

だから私はpython 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   <----------

だから、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をまったく試さないようです。

私はこれを何年もしていないので、何かを見落としているかもしれません。誰でも問題を解決できますか?

前もって感謝します。

56
Matteo Caprari

OpenSSLが標準の場所にない場合は、Modules/Setup.distを編集してOpenSSLの場所を指定する必要があります。から Python 2.5.1 でSSLサポートを取得する)==:

python(httplib.HTTPSConnectionやimaplib.IMAP4_SSLのようなものでクライアントを使用するために)でsslサポートを必要とするLinuxボックスで自分自身を見つけたら、数時間のハンティングを節約しましょうウェブ上で(もちろん、これを見つけた場合は、すでにある程度のレベルのハンティングを行ったことを意味します!).

次の例外メッセージが表示された場合、pythonインストールにsslサポートをコンパイルする必要があるかどうかがわかります。AttributeError: 'module' object has no attribute 'ssl'

それをなくすためにpythonコードを楽に続けるには、まずOpenSSLがインストールされていることを確認する必要があります。デフォルトでは、ソースからインストールされます:/ usr /ローカル/ 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を再度実行します。

59

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
6
Soli

私のためにModules/Setup_hashlibモジュールは、間違ったOpenSSLバージョンを使用することになりました。およびLD_LIBRARY_PATHは、SLESシステムの実行時に考慮されませんでした。

うまくいったのは、ローカルOpenSSLを両方の_sslおよび_hashlib編集setup.pyごと GitHubパッチ:eddy-geek/python_custom_openssl.diff 、その後make clean && make

コンパイル時にコアダンプpythonカスタムopensslバージョンで) でStack Overflowで静的リンクを使用した理由の詳細。

4
eddygeek

Python 2.7.11。で使用した完全なプロセスを次に示します。


最上位のPython2.7.11ソースディレクトリ:

  1. 変化する Modules/Setup.distModules/Setup:コメントを解除_sslセクション、コメントアウト_socket(既にコメントアウトされている場合は何もしません)、コメントを外してSSLを適切に設定します(新しいsslへのパスlib/includesなど)

    注:Modules/Setupファイルは最初は存在しませんが、最初に実行した後、Modules/Setup.distからコンテンツを取得します。毎回実行する前に、ここに変更が反映されていることを確認してください。

  2. パッチを適用: http://Gist.github.com/eddy-geek/9604982 (以前にmakeを実行した場合はdistcleanを作成)

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

以下の2および3の静的opensslおよび静的libintlのパッチをいくつか用意しています。

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
Rafael Kitover

Opensslのログに戻るまで、私は同じ結果を得ていました。そこで、opensslをビルドするときに-fPICを使用する必要があることを見ました: '_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

次に、opensslのmake、make install、そしてPythonを再度ビルドします。

2
ferchor2003

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を検索したためだと思います。

1
user2189731

MAC OS High Sierra、およびPython-3.5.6上記の回答では、ソースを使用してopensslのインストールが行われますが、brewを使用してインストールする場合、インストールされたパッケージの場所がわかりますので、brewを使用してopensslをインストールする場合

brew install openssl

これにより、opensslが/ usr/local/Cellar/openssl/1.0.2o_2 /にインストールされます。このパスは、Modules/Setup.distで更新する必要があります。

opensslのインストール場所がModules/Setup.distを更新するために言及されていない場合、上記のこの回答に従ってください

上記の行でSSL値を更新します

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

行のコメントを外し、CMMを実行すると、pythonがopensslでコンパイルされます。

0
H S Rathore

-Wl,-rpath,/home/fds/rms/local/libLDPATHに追加してみてください。

0
Pär Wieslander