【问题标题】:Is there any documentation around this PyMysql/Mysql behavior?有没有关于这个 PyMysql/Mysql 行为的文档?
【发布时间】:2019-10-05 18:02:51
【问题描述】:

这是我用来连接数据库的 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,而用户 wo 启用了 ssl。 - (通过ALTER USER 'encrypted_user'@'%' REQUIRE SSL;

我的问题是,我在任何 MySQL 版本数据库中看到的这种 pymysql 行为是真实的还是在任何地方都有记录?我所指的行为是,如果您将 ssl 选项添加到连接调用,它应该可以工作(成功连接),无论实际用户是否需要 SSL。我不想测试每个 Mysql 版本:)

通过查看 pymysql 代码,它似乎做的是 check 如果有任何与请求关联的 ssl 参数,将其添加到 ssl 映射,然后 creates 来自该 ssl 映射的 ctx_object并在使用数据库初始化 socket 时使用该 ctx_ 对象。

【问题讨论】:

    标签: mysql ssl amazon-rds pymysql


    【解决方案1】:

    刚刚在 Mysql 7 文档 guide 上找到了这个

    “在服务器端,--ssl 选项指定服务器允许但不需要加密连接。此选项默认启用,因此无需明确指定。”

    "默认情况下,如果服务器支持加密连接,MySQL 客户端程序会尝试建立加密连接,可通过 --ssl-mode 选项进一步控制:"

    “在没有 --ssl-mode 选项的情况下,客户端尝试使用加密进行连接,如果无法建立加密连接,则回退到未加密的连接。这也是显式 --ssl-mode 的行为=首选选项。”

    “PREFERRED:如果服务器支持加密连接,则建立加密连接,如果无法建立加密连接,则回退到未加密连接。如果未指定 --ssl-mode,则这是默认设置。”

    所以我相信发生的事情是 pymysql 没有指定 ssl-mode 选项,所以使用的 ssl 客户端模式是 PREFERRED 这意味着客户端(pymysql)将尝试建立 ssl 连接(我认为失败因为用户不需要它)然后回退到将成功的未加密连接。

    【讨论】:

    • "默认情况下,MySQL 客户端程序会尝试..." 指的是与服务器捆绑的官方实用程序,例如 mysql CLI、mysqldumpmysqladmin等。没有适用于所有客户端库的一揽子声明。 ssl-mode 是写入这些程序的逻辑,而不是传递给服务器的值。有线协议只允许客户端软件通过翻转客户端功能位图中的一位来指示它想要执行 SSL 还是不执行,只有在服务器也设置了相同的位时它才能正确启用,表明服务器支持 SSL。
    • 与不需要 SSL 但指定 SSL 选项的用户连接,并使用该连接运行查询 SHOW STATUS LIKE 'SSL_CIPHER';。如果你得到一个密码名称——我怀疑你会——那么即使特定用户不需要使用它,连接仍然使用 SSL。
    • @Michael-sqlbot 谢谢,刚刚尝试了 SHOW STATUS LIKE 'SSL_CIPHER' 使用不需要 SSL 的用户的连接并取回密码名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2021-03-03
    • 1970-01-01
    • 2022-01-23
    • 2015-05-28
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多