【问题标题】:'unsupported protocol' error when using PyMySQL使用 PyMySQL 时出现“不支持的协议”错误
【发布时间】:2020-11-07 21:51:38
【问题描述】:

我正在尝试连接到启用 SSL 的 MariaDB。 在我的旧安装(Kubuntu 19.10)上,这有效。 使用新安装(也是新 PC:Xubuntu 20.04)我收到以下错误消息:

ssl.SSLError: [SSL: UNSUPPORTED_PROTOCOL] 不支持的协议 (_ssl.c:1108)

这是我的安装细节:
旧安装:python 3.7.5、pymysql 0.9.3、ssl.OPENSSL_VERSION = 1.1.1c 2019 年 5 月 28 日
全新安装:python 3.8.2、pymysql 0.9.3、ssl.OPENSSL_VERSION = 1.1.1f 2020 年 3 月 31 日

我已经在我的新 PC 上编译了 python 3.7.5 -> 我仍然收到错误消息。
我用不同的 SSL 版本编译了 python:
这有效:python 3.7.5,ssl.OPENSSL_VERSION = OpenSSL 1.1.0m-dev xx XXX xxxx
这有效:python 3.7.5,ssl.OPENSSL_VERSION = OpenSSL 1.1.1h-dev xx XXX xxxx
这有效:python 3.8.2,ssl.OPENSSL_VERSION = OpenSSL 1.1.1h-dev xx XXX xxxx

这是我的测试脚本:

import os
import pymysql

#pymysql.connections.DEBUG = True
#pymysql._auth.DEBUG = True

host = "127.0.0.1"
port = 3306

ca = os.path.expanduser("~/ca-cert.pem")
ssl = {'ca': ca, 'check_hostname': False}

user = 'user'
passwd = 'passwd'


def test_ssl():
    con = pymysql.connect(user=user, password=passwd, host=host, port=port, ssl=ssl)
    con.close()

test_ssl()

我这样创建的 ca-cert:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem

似乎 openSSL 的一个特定版本不能与 PyMySQL 一起使用。 Xubuntu 编译可能有错误。或者它可能是特定版本(1.1.1f)。但我不知道,如何自己编译这个版本。

【问题讨论】:

    标签: openssl pymysql ubuntu-20.04


    【解决方案1】:

    我遇到了同样的问题,但我找到了解决方案。

    我正在创建一个基于 ubuntu 20.04 和 Python3.8.2 的 docker 容器。它默认安装了openssl。 2020-Mar-31 12:41:55 openssl-1.1.1f.tar.gz 的版本给了我这个错误:ssl.SSLError: [SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)。在寻找解决方案后,我找到了这个链接:https://cloudwafer.com/blog/installing-openssl-on-ubuntu-16-04-18-04/。在该链接中,您可以找到如何从源代码安装 openssl。它向您展示了如何从 2019-May-28 13:26:28 openssl-1.1.1c.tar.gz 安装版本。首先,我按原样构建容器并登录,然后按照链接中的步骤进行操作。它解决了我的问题。 2020 年 3 月的最新版本导致了该问题。

    我在构建 docker 容器时添加了以下代码行以自动执行这些步骤。见:

    RUN apt install build-essential checkinstall zlib1g-dev -y
    WORKDIR /usr/local/src/
    RUN wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar -xf openssl-1.1.1c.tar.gz
    WORKDIR openssl-1.1.1c
    RUN ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib && make && make install
    COPY ./openssl-1.1.1c.conf /etc/ld.so.conf.d/
    RUN ldconfig -v && mv /usr/bin/c_rehash /usr/bin/c_rehash.backup && mv /usr/bin/openssl /usr/bin/openssl.backup
    ENV PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/ssl/bin"
    
    • 请注意,我在构建容器之前创建了 openssl-1.1.1c.conf 文件。该文件是从保存 dockerfile 的同一目录中复制的。创建具有该名称的文件并将其粘贴到:/usr/local/ssl/lib

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      相关资源
      最近更新 更多