首页 > 解决方案 > 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标志的弃用而不是首选。

我希望你们中的一些人能看到我遗漏了什么!

标签: pythonmysqlsslmysql-pythonmysql-connector-python

解决方案


推荐阅读