• 【python】linux系统python报错“ssl module in Python is not available”


    一、问题现象

    1.1 执行pip命令报错

    pip安装时遇到openssl问题,没办法安装第三方库

    “WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. ”

    1.2 导入import  ssl 报错

    直接执行python,进入python, 输入import  ssl ,也会报相似的错误。 

    正常情况下,是这样的,导入成功无报错

    1.3 执行python脚本报错

    二、问题原因

    根据出错信息提示分析:ssl模块不可用。

    pip默认的安装源https://pypi.org/simple/,采用的是 HTTPS协议,连接是需要SSL库加密和解密。出错信息显示,你的Python没有所需的ssl模块。官网下载的Python已经内建了ssl模块,应该不会出现这个问题。

    2.1 openssl版本低

    系统版本centos7.4,其中openssl的版本为OpenSSL 1.0.2k-fips,而python3.11需要的openssl的版本为1.1.x及以上,需要对openssl进行升级,并重新编译python3.11(yum 安装的openssl 版本都比较低)。现在有些高版本的linux,openssl已经是1.1.x版本以上,不会出现该opensll版本问题。

    2.3 openssl配置问题

    已经源码编译安装了高版本的openssl,由于没有配置软链接、和openssl库的位置,导致的问题。

    三、解决方案 

    3.1 版本低-做OpenSSL升级

    3.1.1 直接yum安装高版本的openssl 

    1. yum install -y openssl openssl-libs openssl-devel openssl-static
    2. #查看版本
    3. openssl version

    3.1.2 源码安装openssl升级(推荐)

    1. wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1q.tar.gz
    2. tar -zxvf openssl-1.1.1q.tar.gz
    3. cd openssl-1.1.1q
    4. ./config --prefix=/usr/local/openssl
    5. make -j8
    6. make install
    7. #设置软连接到新版本openssl
    8. ln -sf /usr/local/bin/openssl /usr/bin/openssl
    9. ln -sf /usr/local/include/openssl /usr/include/openssl
    10. #openssl库位置配置
    11. ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    12. ln -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
    13. echo "/usr/local/lib/" >> /etc/ld.so.conf
    14. ldconfig -v
    15. openssl version
    16. openssl version -a

    但是安装好之后,还可能出现以下问题

    openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory ,这是由于openssl库的位置不正确造成的。

    解决方法:以root用户下执行:

    ln -s    /usr/local/lib64/libssl.so.1.1          /usr/lib64/libssl.so.1.1
    ln -s    /usr/local/lib64/libcrypto.so.1.1    /usr/lib64/libcrypto.so.1.1

     我本机安装的情况:


    3.2 配置问题-补充配置

    1. #设置软连接到新版本openssl
    2. ln -sf /usr/local/bin/openssl /usr/bin/openssl
    3. ln -sf /usr/local/include/openssl /usr/include/openssl
    4. #openssl库位置配置
    5. ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    6. ln -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

    看到有的网上说做环境变量配置,但是 感觉做软链接更清晰、简单点。就不谈环境变量配置了。

    四、本人采取的方式(不推荐)

    参考博主方法https://www.cnblogs.com/miyuanbiotech/p/12307875.html ,也能解决,

    但是它是在编译时,可以直接将ssl模块编译进去。如果在安装其他版本的python到本机,不将openssl高版本编译进去,还是不能用。 所以推荐使用上面(三、解决方案)的方法解决该问题。

    现在有些高版本的linux,openssl已经是1.1.x版本以上,不会出现该opensll版本问题。

    4.1 包下载和安装路径配置

    1. wget -c https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
    2. tar -xvf Python-3.8.1.tgz
    3. cd Python-3.8.1
    4. ./configure --prefix=/my/path/python/
    5. # 配置环境后先别急着编译

    4.2 Modules/Setup文件修改

    1. SSL=/my/path/openssl #改为刚安装的ssl路径
    2. _ssl _ssl.c \
    3. -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
    4. -L$(SSL)/lib -lssl -lcrypto

    4.3 编译安装

    make && make install

    此时如果直接make编译,仍会报如下类似错误:./python: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory generate-posix-vars failed make: *** [pybuilddir.txt] Error 1 缺少库文件,说明libssl.so.1.1这个库没有读取到。解决方法:有的是以root身份添加软链接。有的将openssl库加入环境变量。这个博主选择了后者。

    1. #执行该命令 添加环境变量
    2. export LD_LIBRARY_PATH=/my/path/openssl-1.1/lib:$LD_LIBRARY_PATH

    (此处说一个比较坑的事)

    环境变量配置,虽然运行python、和python脚本都没问题。但是做定时任务crontab 时,由于找不到openssl库,任务跑不起来。害自己排错好久,才找到这个原因。最后重新做了 openssl库文件的软连接。
    ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    n -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

    4.4 测试SSL模块

     该现象说明问题解决了。

    五、知识拓展

    centos7系统默认安装了python2.X,后续可能又安装了python3.X版本,所以在控制台输入命令进行查看当前机器上安装python情况。因为centos7部分模块依赖于2.X,所以为了不引起某些麻烦,选择不去卸载2.X,直接安装3.X。

    1. # 查看2.x版本情况
    2. python --version
    3. python -V
    4. # 查看3.x版本情况
    5. python3 --version
    6. python3 -V 和python

  • 相关阅读:
    JavaScript 30. JSON
    [附源码]Python计算机毕业设计Django兴达五金日杂批发商店管理系统
    [面试]我们常说的负载均衡是什么东西?
    创建.gitignore文件并使用
    NoSql 数据库简介
    如何入门渗透测试(非常详细),从零基础入门到精通,看完这一篇就够了
    Java:javaagent
    vue.js毕业设计,基于vue.js前后端分离订座预约系统设计与实现(H5移动项目)
    JMeter集结点的使用场景以及如何使用?
    读数据压缩入门笔记01_数据压缩导读
  • 原文地址:https://blog.csdn.net/Best_lgx/article/details/136189261