背景

重新安装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