Соединение с mysql (MariaDB) завершается ошибкой в ​​python-> SQLAlchemy, в то время как оно успешно выполняется в cmd

Я пытаюсь подключиться к удаленной базе данных mysql (MariaDB) с некоторыми параметрами безопасности в приложении flask, используя db_url. Упрощенная тестовая версия:

from sqlalchemy import create_engine
engine = create_engine(
    'mysql+mysqlconnector://user:password@remote.host.com:3306/mydb?'+
    'ssl_key=/path/to/key.pem'+
    '&ssl_cert=/path/to/scrt.crt'
)
connection = engine.connect()

И получить ошибку, которая приводит к проблеме с SSL

sqlalchemy.exc.InterfaceError: (mysql.connector.errors.InterfaceError) 2026 (HY000): SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
(Background on this error at: http://sqlalche.me/e/rvf5)

(Я также пробовал pymysql вместо mysqlconnector)

ОДНАКО (чего я не понимаю) когда пытаюсь подключиться из командной строки - работает.

mysql -u user -ppassword mydb -h remote.host.com --ssl-cert=/path/to/scrt.crt --ssl-key=/path/to/key.pem

На всякий случай:

> SHOW VARIABLES LIKE "%version%";

+-----------------------------------+------------------------------------------+
| Variable_name                     | Value                                    |
+-----------------------------------+------------------------------------------+
| in_predicate_conversion_threshold | 1000                                     |
| innodb_version                    | 10.3.34                                  |
| protocol_version                  | 10                                       |
| slave_type_conversions            |                                          |
| system_versioning_alter_history   | ERROR                                    |
| system_versioning_asof            | DEFAULT                                  |
| version                           | 10.3.34-MariaDB-0ubuntu0.20.04.1         |
| version_comment                   | Ubuntu 20.04                             |
| version_compile_machine           | x86_64                                   |
| version_compile_os                | debian-linux-gnu                         |
| version_malloc_library            | system                                   |
| version_source_revision           | a36fc80aeb3f835fad02f443d65dc608b74b92d1 |
| version_ssl_library               | YaSSL 2.4.4                              |
| wsrep_patch_version               | wsrep_25.24                              |
+-----------------------------------+------------------------------------------+

На всякий случай 2. Так же в конфиге openssl /etc/ssl/openssl.cnf (серверный, а не remote.host.com)

...
[system_default_sect]
MinProtocol = TLSv1.1
...

Примечание. Недавно я обновил сервер до Ubuntu 20.04.4 LTS, а Python — до 3.8.10 (возможно, это не имеет значения).


2
65
1

Ответ:

Решено

После долгих копаний проблема оказалась в устаревшей версии удаленной базы данных. После обновления все работает как задумано.

Насколько я понимаю, версии TLS, которые использовались в базе данных, были слишком небезопасными (отсутствовали в переменных %version%). После обновления я получил в результатах:

tls_version    | TLSv1.1,TLSv1.2,TLSv1.3 

Который совместим с версией, требуемой openssl на клиенте (MinProtocol = TLSv1.1)