Python MySQLdb的CA SSL参数不生效,但密钥有效?

5 投票
2 回答
5122 浏览
提问于 2025-04-17 01:16

我正在尝试连接一个需要SSL的MySQL数据库(只进行服务器认证,不是双向认证)。我把服务器的CA证书保存为.pem文件,放在我运行脚本的同一个目录下。我的连接字符串看起来是这样的:

ssl_settings = {'ca':'ca.pem'}
conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASS, db=DB, ssl=ssl_settings}

这样会出现“错误2026:SSL连接错误”。但是,如果我把ssl_settings改成:

ssl_settings = {'key':'ca.pem'}

数据库就能正常连接,脚本也能执行。根据我对SSL参数的理解,'cert'和'key'应该只是用于客户端认证服务器,那么为什么后面的SSL设置能正常工作,而指定CA文件却不行呢?

Python 2.4.3(我知道很旧)
MySQL-python 1.2.1

2 个回答

1

你可以把键值改成任何东西。

我在使用 MySQLdb 版本 1.3.12 时也发现了同样的情况。要用 MySQLdb 设置 SSL 连接,只要把 ssl 参数设置成任何值都可以正常工作(我用的是 Python3):

$ python
Python 3.6.8 (default, Dec 26 2018, 09:19:39) 
>>> import MySQLdb
>>> MySQLdb.__version__
'1.3.12'
>>> db = MySQLdb.connect(host='10.105.136.101', user='my-user', passwd='myPassword', ssl={'ssl' : {'ca': '/junk/file'}})
>>> db
<_mysql.connection open to '10.105.136.101' at 561aaa994f98>

即使把上面的 ssl 设置成一个不存在的证书 /junk/file,也不会报错,依然可以正常使用。

3

注意:这个问题已经修复了。根据这个问题的描述:

在5.1.66、5.5.28、5.6.7和5.7.0的更新日志中都有提到。

--ssl-key选项的参数没有被检查是否存在以及是否是一个有效的密钥。虽然连接使用了SSL,但实际上并没有使用这个密钥。


旧答案

如果想要更详细的描述,可以查看 http://bugs.mysql.com/bug.php?id=62743http://www.chriscalender.com/?p=325

根据我(承认不太专业)的理解,这是一个MySQL的bug。只要你指定仅仅一个密钥(就像你在有效示例中做的那样),MySQL就会建立SSL连接并允许你访问。另一个有趣的地方是,你可以把密钥的值改成任何东西,所以在你的示例中,你可以这样做:

ssl_settings = {'key': 'randomstuff'}

这样仍然可以连接。

撰写回答