MySQL Shell 9.0  /  ...  /  使用加密连接

4.3.4 使用加密连接

连接到启用 TLS(有时称为 SSL)的 MySQL 服务器时,可以使用加密连接。MySQL Shell 的大部分配置都基于 MySQL 服务器使用的选项,有关更多信息,请参阅 使用加密连接

要在启动 MySQL Shell 时配置加密连接,请使用以下命令选项

  • --ssl-mode : 此选项指定与服务器连接所需的安全性状态。

  • --ssl-ca=file_name: 包含受信任 SSL 证书颁发机构列表的 PEM 格式文件的路径。

  • --ssl-capath=dir_name: 包含受信任 SSL 证书颁发机构证书(以 PEM 格式)的目录的路径。

  • --ssl-cert=file_name: 要用于建立加密连接的 PEM 格式 SSL 证书文件的名称。

  • --ssl-cipher=name: 要用于建立加密连接的 SSL 密码的名称。

  • --ssl-key=file_name: 要用于建立加密连接的 PEM 格式 SSL 密钥文件的名称。

  • --ssl-crl=name: 包含以 PEM 格式表示的证书吊销列表的文件的路径。

  • --ssl-crlpath=dir_name: 包含以 PEM 格式表示的证书吊销列表的文件的目录的路径。

  • --tls-ciphersuites=suites: 允许用于加密连接的 TLS 密码套件,指定为以冒号分隔的 TLS 密码套件名称列表。例如 --tls-ciphersuites=TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256.

  • --tls-version=version: 允许用于加密连接的 TLS 协议,指定为以逗号分隔的列表。例如 --tls-version=TLSv1.2,TLSv1.3.

    从 MySQL 8.0.28 开始,MySQL 服务器不支持 TLSv1 和 TLSv1.1 协议,并且 MySQL Shell 无法使用设置为 TLSv1 或 TLSv1.1 的协议建立 TLS/SSL 连接。如果尝试从任何版本的 MySQL Shell 到 8.0.28 或更高版本的 MySQL 服务器实例建立使用 TLS/SSL 的连接,并且使用 --tls-version 选项指定 TLSv1 或 TLSv1.1 协议,您将看到以下结果

    • 对于 TCP 连接,连接失败,并向 MySQL Shell 返回错误。

    • 对于套接字连接,如果 --ssl-mode 设置为 REQUIRED,连接将失败。如果 --ssl-mode 未设置为 REQUIRED,连接将建立,但 TLS/SSL 将被禁用。

    TLSv1 和 TLSv1.1 协议已在 MySQL 8.0.26 中弃用。有关背景信息,请参阅 IETF 备忘录 弃用 TLSv1.0 和 TLSv1.1。使用更安全的 TLSv1.2 和 TLSv1.3 协议在 MySQL Shell 和 MySQL 服务器之间建立连接。TLSv1.3 要求 MySQL 服务器和客户端应用程序都使用 OpenSSL 1.1.1 或更高版本编译。有关 MySQL 服务器版本中对 TLS 协议版本支持的更多信息,请参阅 删除对 TLSv1 和 TLSv1.1 协议的支持

或者,SSL 选项可以作为查询元素的一部分,编码为类似 URI 的连接字符串的一部分。可用的 SSL 选项与上面列出的选项相同,但没有前导连字符。例如,ssl-ca 等效于 --ssl-ca.

类似 URI 的字符串中指定的路径必须进行百分比编码,例如

[email protected]?ssl-ca%3D%2Froot%2Fclientcert%2Fca-cert.pem%26ssl-cert%3D%2Fro\
ot%2Fclientcert%2Fclient-cert.pem%26ssl-key%3D%2Froot%2Fclientcert%2Fclient-key
.pem

有关更多信息,请参阅 使用类似 URI 的字符串或键值对连接到服务器

要为 JavaScript 或 Python 模式下的脚本会话建立加密连接,请在 connectionData 字典中设置 SSL 信息。例如

mysql-js> var session=mysqlx.getSession({host: 'localhost',
                                             user: 'root',
                                             password: 'password',
                                             ssl_ca: "path_to_ca_file",
                                             ssl_cert: "path_to_cert_file",
                                             ssl_key: "path_to_key_file"});

使用 mysqlx.getSession()mysql.getSession()mysql.getClassicSession() 创建的会话,如果未提供 ssl-mode 且未提供 ssl-cassl-capath,则默认使用 ssl-mode=REQUIRED。如果未提供 ssl-mode 且提供了 ssl-cassl-capath 中的任何一个,则创建的会话默认使用 ssl-mode=VERIFY_CA

有关更多信息,请参阅 使用键值对连接