Python MySQLdb的CA SSL参数不生效,但密钥有效?
我正在尝试连接一个需要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 个回答
你可以把键值改成任何东西。
我在使用 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
,也不会报错,依然可以正常使用。
注意:这个问题已经修复了。根据这个问题的描述:
在5.1.66、5.5.28、5.6.7和5.7.0的更新日志中都有提到。
--ssl-key选项的参数没有被检查是否存在以及是否是一个有效的密钥。虽然连接使用了SSL,但实际上并没有使用这个密钥。
旧答案
如果想要更详细的描述,可以查看 http://bugs.mysql.com/bug.php?id=62743 和 http://www.chriscalender.com/?p=325。
根据我(承认不太专业)的理解,这是一个MySQL的bug。只要你指定仅仅一个密钥(就像你在有效示例中做的那样),MySQL就会建立SSL连接并允许你访问。另一个有趣的地方是,你可以把密钥的值改成任何东西,所以在你的示例中,你可以这样做:
ssl_settings = {'key': 'randomstuff'}
这样仍然可以连接。