连接到 mysql (MariaDB) 在 python->SQLAlchemy 中失败,但在 cmd 中成功
Connection to mysql (MariaDB) fails in python->SQLAlchemy while it succeeds in cmd
我正在尝试使用 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 而不是 mysql 连接器)
HOWEVER(我不明白的地方)
当我尝试从命令行连接时 - 它有效。
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(可能不相关)
经过大量挖掘 - 问题最终是远程数据库的过时版本。升级后一切正常。
我的理解是在数据库上使用的 TLS 版本太不安全(%version%
变量中不存在)。升级后我得到了结果:
tls_version | TLSv1.1,TLSv1.2,TLSv1.3
兼容客户端openssl要求的版本(MinProtocol = TLSv1.1
)
我正在尝试使用 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 而不是 mysql 连接器)
HOWEVER(我不明白的地方) 当我尝试从命令行连接时 - 它有效。
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(可能不相关)
经过大量挖掘 - 问题最终是远程数据库的过时版本。升级后一切正常。
我的理解是在数据库上使用的 TLS 版本太不安全(%version%
变量中不存在)。升级后我得到了结果:
tls_version | TLSv1.1,TLSv1.2,TLSv1.3
兼容客户端openssl要求的版本(MinProtocol = TLSv1.1
)