web-dev-qa-db-ja.com

再コンパイルせずにLinuxにpython sslモジュールをインストールします

Pythonを再コンパイルせずにOpenSSLがすでにインストールされているLinuxボックスにpythonのSSLモジュールをインストールすることは可能ですか?いくつかのファイルをコピーしてそれらを含めるのと同じくらい簡単であることを願っていますライブラリパスPythonバージョンは2.4.3です。ありがとうございます。

11
Phalse

Pythonを再コンパイルせずにOpenSSLがすでにインストールされているLinuxボックスにpythonのSSLモジュールをインストールすることは可能ですか?

はい。 Pythonのsetup.pyは、次のロジックを使用してOpenSSLを検出します。

search_for_ssl_incs_in = [
                      '/usr/local/ssl/include',
                      '/usr/contrib/ssl/include/'
                     ]

ssl_incs = find_file('openssl/ssl.h', inc_dirs,
                     search_for_ssl_incs_in

ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
                             ['/usr/local/ssl/lib',
                              '/usr/contrib/ssl/lib/'
                             ] )

if (ssl_incs is not None and
    ssl_libs is not None):
    exts.append( Extension('_ssl', ['_ssl.c'],
                           include_dirs = ssl_incs,
                           library_dirs = ssl_libs,
                           libraries = ['ssl', 'crypto'],
                           depends = ['socketmodule.h']), )

ポイントはPython is notlibsslおよびlibcryptoに対する静的リンクです(一部の静的リンクはcctyesで発生しますが、他には何も発生しません)。

悪い点は、プロジェクトがシステムパスを使用することですbeforeローカルにインストールされたパス。たとえば、プロジェクトはinc_dirs(システム)beforesearch_for_ssl_incs_in(ローカル)を使用します。 (これについては以下を参照してください)。

configureを実行すると、次の行がコメント化されたModules/Setupが表示されます。

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
#   -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
#   -L$(SSL)/lib -lssl -lcrypto

繰り返しますが、静的リンクはありません。 (これは、Pythonの以前のバージョンがこれらの行のコメントを外したことを前提としています)。

したがって、OpenSSLのバイナリ互換バージョンを構築し、LD_LIBRARY_PATHまたはLD_PREOLADを使用してPythonがOpenSSLの最新バージョンを使用するようにする必要があります。

OpenSSL 0.9.7および0.9.8はバイナリ互換です。 OpenSSL 1.0.0、1.0.1、および1.0.2はバイナリ互換です。 OpenSSL 0.9.8および1.0.0はnotバイナリ互換です。

----------

これは、Pythonのセットアップ配置システムインクルードの問題ですbeforeローカルインクルード:

export CFLAGS="-I/usr/local/ssl/darwin/include"; export LDFLAGS="-L/usr/local/ssl/darwin/lib"
<edit Setup search_for_ssl_incs_in and search_for_ssl_incs_in>
./configure
<edit Modules/Setup>
make
...
/Users/jww/Python-3.4.2/Modules/_ssl.c:390:9: warning: 
      'ERR_peek_last_error' is deprecated [-Wdeprecated-declarations]
    e = ERR_peek_last_error();
        ^
/usr/include/openssl/err.h:274:15: note: 'ERR_peek_last_error' declared here
unsigned long ERR_peek_last_error(void) DEPRECATED_IN_MAC_OS_X_VERSION_1...
              ^
/Users/jww/Python-3.4.2/Modules/_ssl.c:393:15: warning: 
      'SSL_get_error' is deprecated [-Wdeprecated-declarations]
        err = SSL_get_error(obj->ssl, ret);
...

Pythonは、最近のOpenSSL 1.0.1kではなく、Appleが提供するOpenSSLのダウンレベルバージョン0.9.8バージョンを使用しました。それは私にもかかわらず(1)CFLAGSLDFLAGSでそれらをエクスポートしています。 (2)Setupの編集; (3)Modules/Setupの編集。

そして、まだ実行時のパスの問題が解決されていないので、LD_PRELOAD_PATHDYNLIB_LIBRARY_PATHなどを使用する必要があります。

6
jww

注: Python> = 2.6にはすでにSSLサポートが組み込まれているため、sslパッケージをインストールする必要はありません。

Pypiからパッケージをインストールします。

pip install ssl

pipコマンドがない場合は、ディストリビューション用にインストールします。

RedHat/Centos:

yum install python-pip

Debian/Ubuntu

apt-get install python-pip
3
VT_Drew