python - 在 python->SQLAlchemy 中连接到 mysql (MariaDB) 失败,而在 cmd 中成功

标签 python mysql ssl sqlalchemy mariadb

我正在尝试使用 db_url 在 flask 应用程序中使用一些安全选项连接到远程 mysql (MariaDB) 数据库。简化测试版:

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 config /etc/ssl/openssl.cnf (服务器的,不是remote.host.com)
...
[system_default_sect]
MinProtocol = TLSv1.1
...
注意:我最近将服务器更新为 Ubuntu 20.04.4 LTS,将 python 更新为 3.8.10(可能不相关)

最佳答案

经过大量挖掘 - 问题最终成为远程数据库的过时版本。升级后一切都按预期工作。
我的理解是用于数据库的 TLS 版本太不安全(%version% 变量中不存在)。升级后我得到了结果:

tls_version    | TLSv1.1,TLSv1.2,TLSv1.3 
与客户端上 openssl 所需的版本兼容( MinProtocol = TLSv1.1 )

关于python - 在 python->SQLAlchemy 中连接到 mysql (MariaDB) 失败,而在 cmd 中成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71547771/

相关文章:

python - 如果 dtype 是类别(MemoryError),则 pivot_table 需要更多内存

python - VSCode,为什么我在尝试将 mysqlclient 安装到 django 项目时出现错误

node.js - mosca MQTT 代理的安全 key 和证书

java - 如何通过 ssl 发送请求?

mysql - 无法使用 mysql 命令行使用 Unicode 字符

Android Socket.io Websocket 传输不适用于 SSL

python - pandas 将多个 groupby 结果放入同一个表中

python - 在 python/pygame 中使用箭头键使图像移动一格

python - 是否可以根据 geopandas 中的属性添加不同的缓冲区?

php - 即使数据库大小为 0.000MB,如何获取 MySQL 数据库列表?