是否可以在已安装OpenSSL的Linux机器上安装python的SSL模块而无需重新编译python?我希望它就像复制几个文件并将它们包含在库路径中一样简单。 Python版本是2.4.3。 谢谢!
答案 0 :(得分:4)
是否可以在已经安装了OpenSSL的Linux机器上安装python的SSL模块,而无需重新编译python?
是。 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与libssl
和libcrypto
的 静态链接。 (某些静态链接与cctyes
一起发生,但没有其他内容。)
现在,糟糕的是项目在本地安装的路径之前使用系统路径。例如,项目在 inc_dirs
(本地)之前使用search_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 不二进制兼容。
以下问题与Python的设置放置系统包括之前本地包括:
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使用Apple提供的OpenSSL的低级版本0.9.8版本,而不是我最近的OpenSSL 1.0.1k。尽管如此我还是(1)在CFLAGS
和LDFLAGS
中导出了这些内容。 (2)编辑Setup
; (3)编辑Modules/Setup
。
我仍然遇到运行时路径问题,因此我需要使用LD_PRELOAD_PATH
,DYNLIB_LIBRARY_PATH
等。
答案 1 :(得分:1)
注意: Python&gt; = 2.6已内置SSL支持,无需安装ssl
软件包。
从pypi安装包:
pip install ssl
如果您缺少pip
命令,请将其安装到您的发行版中:
的RedHat / Centos的:
yum install python-pip
于Debian / Ubuntu
apt-get install python-pip