Ошибка «неподдерживаемый протокол» при использовании PyMySQL

Я пытаюсь подключиться к своей MariaDB с включенным SSL. На моей старой установке (Kubuntu 19.10) это работало. При новой установке (также новый ПК: 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 28 мая 2019 г.
Новая установка: python 3.8.2, pymysql 0.9.3, ssl. OPENSSL_VERSION = 1.1.1f 31 марта 2020 г.

Я скомпилировал python 3.7.5 на своем новом ПК –› я все еще получаю сообщение об ошибке.
Я скомпилировал python с другой версией SSL:
это работает: 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 хх ххх хххх

Это мой тестовый скрипт:

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-сертификат, который я создал следующим образом:

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). Но я не знаю, как самому собрать эту версию.


person Leon    schedule 18.07.2020    source источник


Ответы (1)


У меня была такая же проблема, но я нашел решение.

Я создавал контейнер докеров на основе Ubuntu 20.04 и Python3.8.2. Он установил openssl по умолчанию. Версия от 31 марта 2020 г. 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-May-28 13:26:28 openssl-1.1.1c.tar.gz. Сначала я построил свой контейнер, как изначально, и вошел в систему, и я выполнил шаги по ссылке. Это решило мою проблему. Последняя версия от марта 2020 года вызывала проблему.

Я добавил приведенные ниже строки кода при создании контейнера докеров, чтобы автоматизировать шаги. Видеть:

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
person Alfredo Contreras    schedule 18.08.2020