解决 Python 报错 NotOpenSSLWarning: urllib3 v2 仅支持 OpenSSL 1.1.1

报错分析

  • 完整的报错:urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
  • 报错分析:LibreSSL 是 OpenSSL 的一个分支,LibreSSL 2.8.3 与OpenSSL 1.1.1版本相似(有差异)。Mac版python里的ssl默认使用LibreSSL 2.8.3 编译,也就是OpenSSL 1.1.1。而urllib3 v2仅支持OpenSSL 1.1.1以上的版本,因此MAC版python里的ssl版本落后了。
  • 解决办法:

    1. 升级LibreSSL(没用,LibreSSL升级了但是python里的ssl库没更新)
    # 查看当前用户,确保非root(id 不为0)
    whoami
    # 查看是否是root
    id -u
    
    # 修改目录权限
    sudo chown -R $(whoami) /opt/homebrew
    
    # 升级libressl
    brew update
    brew upgrade libressl
    
    # 设置libressl环境变量
    echo 'export PATH="/opt/homebrew/opt/libressl/bin:$PATH"' >> ~/.zshrc
    # 设置编译器环境变量:为了让编译器找到 LibreSSL
    echo 'export LDFLAGS="-L$(brew --prefix openssl)/lib"' >> ~/.zshrc 
    echo 'export CPPFLAGS="-I$(brew --prefix openssl)/include"' >> ~/.zshrc
    
    # 使生效
    source ~/.zshrc
    
    # 查看版本
    openssl version
    >LibreSSL 3.9.1
    
    1. urllib3降级(可行,但有种越混越回去的感觉)
    pip install 'urllib3<2.0'
    
    1. 虚拟环境单独安装对应版本的urllib3 和 OpenSSL

    2. 重新源码编译python

    ./configure --with-openssl=$(brew --prefix openssl)
    # ./configure --with-openssl=$(brew --prefix libressl)
    
    make
    sudo make install
    
    1. 忽略警告
    import warnings
    from urllib3.exceptions import NotOpenSSLWarning
    warnings.filterwarnings("ignore", category=NotOpenSSLWarning)
    

    作者:zyanwei2018

    物联沃分享整理
    物联沃-IOTWORD物联网 » 解决 Python 报错 NotOpenSSLWarning: urllib3 v2 仅支持 OpenSSL 1.1.1

    发表回复