我试图在尝试连接到 MySQL 服务器(通过 mysql-connector-python)时了解 SSL 的工作原理。我有 MySQL (v5.7) 并且有 2 个用户。其中一个 (root) 是默认用户,另一个用户 (ssl_user) 启用了 REQUIRE SSL 选项。如果我尝试使用以下配置连接到 ssl_user,则会收到一条错误消息,指出 ssl_user 无权访问。
mysql_conf = {
'host': '127.0.0.1',
'port': '3306',
'user': 'root',
'password': '',
'ssl_disabled': True #Default value is False
}
conn = mysql.connector.connect(**mysql_conf)
如果我将特定用户的值更改为 'ssl_disabled': False,我就能够连接到 MySQL。
我正在通过我的 Flask 应用程序连接到 mysql 服务器,通过使用 Require ssl 创建的用户连接时到底发生了什么?这是否意味着该用户的连接已加密?如果是这样,加密发生在哪里?
我无法理解通过 'ssl_disabled': False 连接和通过提供 SSL 证书连接之间到底有什么区别?
默认情况下,Python 连接器更喜欢使用 SSL,或者如果您设置了
ssl_disabled=False
.不幸的是,这是双重否定。这意味着您没有禁用 SSL,因此它已启用。
ssl-mode
如果他们遵循其他使用, 设置为“DISABLED”、“PREFERRED”、“REQUIRED”、“VERIFY_CA”、“VERIFY_IDENTITY”之一的MySQL 客户端的约定,情况会更清楚。默认情况下,MySQL 用户可以通过 TCP 使用加密 SSL 连接或非加密连接进行连接。通过使用 定义用户
REQUIRE SSL
,如果未启用 SSL,用户将无法连接。加密发生在 Python 连接器调用的 MySQL 客户端库中。这就是 MySQL 协议的实现之处。许多其他客户端使用相同的 MySQL 客户端库,例如 Ruby、PHP、Perl 或 C++ 客户端。
我可以使用 MySQL 命令行客户端测试与您类似的用户,该客户端也使用相同的客户端库。
我创建了我的用户:
然后在另一个窗口中我尝试从 shell 提示符进行连接:
这正如预期的那样。如果用户被定义为需要 SSL,并且客户端尝试在禁用 SSL 的情况下进行连接,则该用户无法连接。
状态通过命名正在使用的密码来报告当前会话正在使用 SSL。如果我没有通过 SSL 连接,它会显示 SSL 密码“未使用”。
证书是可选的。证书用于安全身份验证。您可以使用 SSL 连接来加密数据包,而无需使用证书。MySQL CREATE USER 语句中有单独的选项,用于要求用户使用证书进行身份验证,但大多数人并不关心这一点。我曾在一家公司工作,我们对 MySQL 用户使用证书而不是密码。这是非常安全的,但它要求公司有自己的证书颁发机构 (CA) 为每个 MySQL 用户创建唯一的证书(他们在公司内的很多事情上使用证书,而不仅仅是 MySQL)。