背景
重新安装Python 3.7.0的版本。
按照之前的套路,安装系统依赖:
yum install bzip2-devel yum install python-devel yum install libffi-dev yum install sqlite-devel yum install libuuid-devel yum install readline-devel yum install mysql-devel
下载源码,手动编译:./configure --prefix=/opt/python/,安装:make && make install。
一切顺利。
问题
在本地执行fab redeploy:python3.7(编写好了fabric脚本,改了创建虚拟环境的命令为python3.7 -m venv),结果:
pip配置了需要TLS / SSL的位置,但Python中的ssl模块不可用。 重试(重试(总计= 4,连接=无,读取=无,重定向=无,状态=无))连接被“SSLError”断开后(“无法连接到HTTPS URL,因为SSL模块不可用。”) “
解决
做为Python的老鸟,这样的错误显然遇到过不少次,方案如下:
1.手动编译安装openssl包,放到/ opt / openssl下.2。配置编译Python时的环境变量:
export LDFLAGS =“ - L / opt / openssl / lib” export CPPFLAGS =“ - I / opt / openssl / include” export PKG_CONFIG_PATH =“/ opt / openssl / lib / pkgconfig”
3.再次制作
这里我用的是OpenSSL的的1.0.2o的版本,奇怪的是做的时候会有警告:
无法构建ssl模块! Python需要与X509_VERIFY_PARAM_set1_host()的OpenSSL 1.0.2或1.1兼容的libssl。 LibreSSL 2.6.4及更早版本不提供必要的API,https://github.com/libressl-portable/portable/issues/381
不太懂为什么不匹配。
不过既然警告中提到了LibreSSL了,索性去看下这个东西。
LibreSSL是OpenSSL的加密软件库的一个分支,是一个安全套接层(SSL)和传输层安全(TLS)协议的开源实现。在OpenSSL的爆出心脏出血安全漏洞之后,一些OpenBSD的开发者于2014年4月创立了LibreSSL,目标是重构的OpenSSL的代码,以提供一个更安全的替代品.LibreSSL复刻自OpenSSL的库的1.0.1g分支,它将遵循OpenBSD的基金会在其他项目所使用的安全指导原则。
---维基百科
它的Logo很有寓意,滴血的心脏(Heartbleed bug)。
于是下载了并安装了LibreSSL,重复上面的逻辑,使时没警告。安装成功。
不过安装完后运行python3.7:import ssl还是会报错:
import _ssl#如果我们无法导入它,让错误传播 ImportError:libssl.so.45:无法打开共享对象文件:没有这样的文件或目录
最终还需要配置:export LD_LIBRARY_PATH = / libressl / lib(你自己的安装路径)。把这个命令放到/ etc / bashrc中。
参考
- “ctypes find_library应该在Linux上搜索LD_LIBRARY_PATH”https://bugs.python.org/issue9998
- https://www.libressl.org/
- https://www.openssl.org/news/newslog.html
- https://hltj.me/security/2017/05/26/libressl-instead-openssl.html