这是我用来连接数据库的pymysql代码。我正在使用带有Mysql版本5.7.22的AWS RDS Mysql实例进行测试。我正在从https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html
获得证书pymysql.connect(secret_dict['host'], user=secret_dict['username'],
passwd=secret_dict['password'], port=port, db=dbname,
connect_timeout=5, ssl={'ca': './rds-combined-ca-bundle.pem'})
此代码与我的测试数据库一起使用,其中用户启用了ssl,而用户启用了ssl。 -(通过ALTER USER'encrypted_user'@'%'需要SSL;)
我的问题是我在任何MySQL verison数据库中看到的pymysql行为是正确的,还是在任何地方都有记录?我指的是如果将ssl选项添加到connect调用中,则不管实际用户是否需要SSL,它都应该可以工作(成功连接)。我宁愿不对每个Mysql版本进行测试:)
通过查看pymsql代码,似乎要做的是check(如果有与请求关联的任何ssl参数),将其添加到ssl映射,然后creates一个ctx_object从该ssl映射中获取,并在使用数据库初始化socket时使用该ctx_对象。
答案 0 :(得分:0)
只需在Mysql 7文档guide
中找到此内容“在服务器端,--ssl选项指定服务器允许但不要求加密连接。此选项默认情况下处于启用状态,因此无需明确指定。”
“默认情况下,如果服务器支持加密连接,则MySQL客户端程序会尝试建立加密连接,并通过--ssl-mode选项提供进一步的控制:”
“在没有--ssl-mode选项的情况下,客户端尝试使用加密进行连接,如果无法建立加密连接,则会退回到未加密的连接。这也是显式--ssl-mode的行为= PREFERRED选项。”
“优选:如果服务器支持加密连接,则建立加密连接;如果无法建立加密连接,则退回到未加密连接。如果未指定--ssl-mode,则为默认设置。”
所以我相信发生的事情是pymysql没有指定ssl-mode选项,因此所使用的ssl客户端模式是PREFERRED,这意味着客户端(pymysql)将尝试建立ssl连接(我认为失败了因为用户不需要它),然后回退到未加密的连接,它将成功。