python - ssl 不与 MySQLdb 一起使用,但与 mysqlconnector 一起使用
问题描述
不幸的是,我无法让 MySQLdb 工作,也无法通过命令行连接到需要我使用 SSL 的 AWS 服务器。这通过 SequelPro 可以正常工作。
什么有效?
除了提到的 GUI 之外,我以编程方式使用mysqlconnector
而不是MySQLdb
作为引擎并传递 ssl args,这很有效:
from sqlalchemy import create_engine
import pandas as pd
pd.read_sql("SHOW DATABASES",
create_engine(CONNECTION_STRING.replace('mysqldb', 'mysqlconnector'),
connect_args={'ssl_ca': '~/Downloads/rds-combined-ca-bundle.pem'}))
什么不起作用?
由于某些原因,我不想使用 mysqlconnector,而是使用 MySQLdb。因此我尝试了以下两种方法:
conn = create_engine(CONNECTION_STRING)
pd.read_sql_query("SHOW DATABASES", conn)
conn = create_engine(
CONNECTION_STRING,
connect_args={'ssl': {'ca': '~/Downloads/rds-combined-ca-bundle.pem'}})
pd.read_sql_query("SHOW DATABASES", conn)
对于第一个,它给出了预期的访问被拒绝:
OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'MYUSER'@'MYHOST' (using password: YES)") (Background on this error at: http://sqlalche.me/e/e3q8)
对于第二个:
OperationalError: (_mysql_exceptions.OperationalError) (2026, 'SSL connection error: error:00000001:lib(0):func(0):reason(1)') (Background on this error at: http://sqlalche.me/e/e3q8)
从谷歌搜索那个“ error:00000001:lib(0):func(0):reason(1)
”错误,我想到了滥用这个包,并多次尝试了各种基本的变体(包括mode=VERIFY_IDENTITY
传递密码):
mysql -h HOST --ssl-ca=~/Downloads/rds-combined-ca-bundle.pem -u USER -p
Enter password:
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
抛出同样的错误。
想法
也许这适用于mysqlconnector(不传递任何东西),因为ssl
包(据我所知,我尝试过的其他两个选项都没有使用它,但肯定来自连接器)输出ssl.get_default_verify_paths()
:
DefaultVerifyPaths(cafile='~/anaconda2/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='~/anaconda2/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='~/anaconda2/ssl/certs')
,所以有一些默认配置可以使这项工作(可能与 sequelPro 相同)。但总而言之,我只是不明白为什么它适用于 sequelPro 和连接器包,但不适用于命令行或 MySQLdb。
尝试以下(从这里)工作正常:
mysql -u MYUSER -h MYHOST --ssl -p
但是由于--ssl
标志的弃用而不是首选。
我希望你们中的一些人能看到我遗漏了什么!
解决方案
推荐阅读
- javascript - 如何在javascript中放入另一个json数据
- apache-spark - spark是逐行还是一起执行转换?
- c - 被 C 中的指针和局部变量弄糊涂了
- windows - 如何同时搜索两个不同的卷名得到字母?
- hibernate - 如何修复 SQL 注入验证码问题 - CWE 564
- php - CodeIgniter GuzzleHttp 403 禁止
- php - 当等于数据透视数据时关联 hasOne 关系
- location - 将代理位置保存在“占用”块中,并在“移动到”块中使用位置
- android - 适用于平板电脑或大屏幕的 Android 底部导航
- java - android - 取消已经开始运行的runnable