使用PyMySQL时出现“不受支持的协议”错误

时间:2020-07-18 05:27:14

标签: openssl pymysql ubuntu-20.04

我正在尝试启用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)。但是我不知道如何自己编译这个版本。

1 个答案:

答案 0 :(得分:0)

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

我正在基于ubuntu 20.04和Python3.8.2。创建一个docker容器。它默认安装了openssl。 2020年3月31日12:41:55 openssl-1.1.1f.tar.gz的版本给我这个错误:ssl.SSLError:[SSL:UNSUPPORTED_PROTOCOL]不支持的协议(_ssl.c:1108)。寻找解决方案后,我找到了此链接:https://cloudwafer.com/blog/installing-openssl-on-ubuntu-16-04-18-04/。在该链接中,您可以找到如何从源代码安装openssl。它显示了如何从2019年5月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
相关问题