python的SSL模块报错no cipher can be selected

问题遇到的现象和发生背景

在我运行从git上下载的程序过程中,有以下报错,不知道怎么解决

img

操作环境、软件版本等信息

liunx centOS6 python3.9 openssl1.1.1

尝试过的解决方法

我看报错信息,网上说法是服务器和客户端加密套件不兼容,但我查看过,服务器端是TLS1.3版本的ECDHE-RSA-AES128-GCM-SHA256,这在我的本地也是支持这个加密套件的

我想要达到的结果

正常运行

你有没有检查过下载的代码有无问题?如果有问题的话你需要对下载过来的代码进行修改。一般如果版本更迭的话,代码也需要进行相应的修改

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先,我们需要确认一下SSL模块的版本是否正确。

    1. 确认SSL模块版本

    使用以下命令查看Python中SSL模块的版本:

    python -c "import ssl; print(ssl.OPENSSL_VERSION)"
    

    如果输出的版本少于1.1.1,说明SSL模块版本不正确,我们需要更新SSL模块。

    1. 更新SSL模块

    使用以下命令安装最新版本的openssl:

    sudo yum update openssl
    

    安装完成后,我们需要重新编译Python并指定使用更新后的openssl库。

    1. 重新编译Python

    下载Python 3.9的源代码,并解压。

    使用以下命令进入Python源代码目录:

    cd Python-3.9.0
    

    接着,编译Python源代码并指定使用更新后的openssl库:

    ./configure --with-openssl=/usr/bin/openssl --enable-optimizations
    make
    sudo make install
    

    编译完成后,重新检查SSL模块的版本是否正确。

    1. 修改程序代码

    如果SSL模块版本已经正确,但程序依然无法正常运行,那么我们可能需要修改程序代码,使其使用正确的加密套件。

    一种可能的解决方案是,在程序的网络请求模块中增加手动指定使用的加密套件。

    以Python的Requests库为例,在发送HTTPS请求时可以使用以下代码指定加密套件:

    import requests
    from requests.adapters import HTTPAdapter
    from requests.packages.urllib3.util.ssl_ import create_urllib3_context
    
    # 自定义加密套件
    ciphers = ':'.join([
        'ECDHE-RSA-AES128-GCM-SHA256',
        'AES128-SHA256',
        'AES128-SHA',
        'ECDHE-RSA-AES256-SHA384',
        'DHE-RSA-AES256-SHA256',
        'DHE-RSA-AES256-SHA',
        'ECDHE-RSA-AES256-SHA',
        'DHE-RSA-AES128-SHA256',
        'DHE-RSA-AES128-SHA',
        'ECDHE-RSA-AES256-GCM-SHA384',
        'ECDHE-ECDSA-AES256-GCM-SHA384',
        'ECDHE-ECDSA-AES128-GCM-SHA256',
    ])
    
    # 创建SSL context
    ctx = create_urllib3_context(ciphers=ciphers)
    
    # 创建Session,并使用自定义的SSL context
    s = requests.Session()
    s.mount('https://', HTTPAdapter(max_retries=3),)
    s.keep_alive = False
    s.verify = True
    s.stream = True
    s.cert = None
    s.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'})
    
    # 发送请求
    response = s.get(url, timeout=10, headers=headers)
    

    以上代码中,我们手动指定使用了ECDHE-RSA-AES128-GCM-SHA256等加密套件。你可以根据服务器端的加密套件列表选择相应的加密套件。

    如果你无法修改程序代码,那么你可能需要联系程序开发者,让其修复程序中的SSL模块问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^