TLS 安全连接

概述

传输层安全性 (Transport Layer Security, TLS) 是一种广泛采用的安全性协议,目的是为互联网通信提供安全及数据完整性保障。

MatrixOne 默认采用非加密连接,也支持启用基于 TLS 协议的加密连接,支持的协议版本有 TLS 1.0, TLS 1.1, TLS 1.2。

  • 不开启 TLS 加密连接(默认):直接使用用户名密码连接 MatrixOne 即可。
  • 使用加密连接:需要在 MatrixOne 服务端开启加密连接支持,并在客户端指定使用加密连接。你可以参加下文指导,开启 TLS 安全连接。

本篇文档将指导你如何开启 TLS 安全连接。

TLS 安全连接配置主要步骤概述

  1. 首先在 MatrixOne 中开启 TLS。

  2. 然后配置 MySQL 客户端安全连接参数。

完成这两个主要步骤的配置后,即可建立 TLS 安全连接,具体操作参见下文:

步骤一:开启 MatrixOne 的 TLS 支持

  1. 生成证书及密钥:MatrixOne 尚不支持加载有密码保护的私钥,因此必须提供一个没有密码的私钥文件。证书和密钥可以使用 OpenSSL 签发和生成,推荐使用 MySQL 自带的工具 mysql_ssl_rsa_setup 快捷生成:

    1. #检查你本地 MySQL 客户端的安装目录
    2. ps -ef|grep mysql
    3. #进入到你本地 MySQL 客户端的安装目录
    4. cd /usr/local/mysql/bin
    5. #生成证书和密钥
    6. ./mysql_ssl_rsa_setup --datadir=<yourpath>
    7. #检查你生成的 pem 文件
    8. ls <yourpath>
    9. ├── ca-key.pem
    10. ├── ca.pem
    11. ├── client-cert.pem
    12. ├── client-key.pem
    13. ├── private_key.pem
    14. ├── public_key.pem
    15. ├── server-cert.pem
    16. └── server-key.pem

    Note: 上述代码中的 <yourpath> 是你需要存放生成的证书及密钥文件的本地目录路径。

  2. 进入到你本地的 MatrixOne 文件目录路径 matrixone/etc/launch-tae-CN-tae-DN/ 中的 cn.toml 配置文件:

    你也可以使用 vim 命令直接在终端中打开 cn.toml 文件

    1. vim $matrixone/etc/launch-tae-CN-tae-DN/cn.toml

    将下面的代码段复制粘贴到配置文件中:

    1. [cn.frontend]
    2. #default is false. With true. Server will support tls
    3. enableTls = true
    4. #default is ''. Path of file that contains X509 certificate in PEM format for client
    5. tlsCertFile = "<yourpath>/server-cert.pem"
    6. #default is ''. Path of file that contains X509 key in PEM format for client
    7. tlsKeyFile = "<yourpath>/server-key.pem"
    8. #default is ''. Path of file that contains list of trusted SSL CAs for client
    9. tlsCaFile = "<yourpath>/ca.pem"

    Note: 上述代码中的 <yourpath> 是你需要存放生成的证书及密钥文件的本地目录路径

    上述代码中,配置参数解释如下:

    参数描述
    enableTls布尔类型,是否在 MatrixOne 服务端打开 TLS 的支持。
    tlsCertFile指定 SSL 证书文件路径
    tlsKeyFile指定证书文件对应的私钥
    tlsCaFile可选,指定受信任的 CA 证书文件路径

    Note: 如果你是使用 Docker 安装部署的 MatrixOne,修改配置文件之前,你需要先挂载配置文件再进行修改,操作具体参见挂载目录到 Docker 容器

  3. 验证 MatrixOne 的 SSL 是否启用。

    ① 使用 MySQL 客户端连接 MatrixOne:

    1. mysql -h 127.0.0.1 -P 6001 -udump -p111
    2. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    ② 使用 Status 命令查看 SSL 是否启用。

    成功启用,代码示例如下,可以看到 SSL 状态为 Cipher in use is TLS_AES_128_GCM_SHA256

    1. mysql> status
    2. mysql Ver 8.0.28 for macos11 on arm64 (MySQL Community Server - GPL)
    3. Connection id: 1001
    4. Current database:
    5. Current user: dump@0.0.0.0
    6. SSL: Cipher in use is TLS_AES_128_GCM_SHA256
    7. Current pager: stdout
    8. Using outfile: ''
    9. Using delimiter: ;
    10. Server version: 0.6.0 MatrixOne
    11. Protocol version: 10
    12. Connection: 127.0.0.1 via TCP/IP
    13. ERROR 20101 (HY000): internal error: the system variable does not exist
    14. ERROR 2014 (HY000): Commands out of sync; you can't run this command now
    15. Client characterset: utf8mb4
    16. Server characterset: utf8mb4
    17. TCP port: 6001
    18. Binary data as: Hexadecimal
    19. --------------

    未启用成功,则返回结果如下,可以看到 SSL 状态为 Not in use,你需要重新检查一下上述步骤中你所配置证书及密钥文件的本地目录路径(即 )是否正确:

    1. mysql> status;
    2. /usr/local/mysql/bin/mysql Ver 8.0.30 for macos12 on arm64 (MySQL Community Server - GPL)
    3. Connection id: 1009
    4. Current database: test
    5. Current user: root@0.0.0.0
    6. SSL: Not in use
    7. Current pager: stdout
    8. Using outfile: ''
    9. Using delimiter: ;
    10. Server version: 8.0.30-MatrixOne-v0.6.0 MatrixOne
    11. Protocol version: 10
    12. Connection: 127.0.0.1 via TCP/IP
    13. Server characterset: utf8mb4
    14. Db characterset: utf8mb4
    15. Client characterset: utf8mb4
    16. Conn. characterset: utf8mb4
    17. TCP port: 6001
    18. Binary data as: Hexadecimal
    19. --------------

完成上述步骤后,即开启了 MatrixOne 的 TLS。

步骤二:配置 MySQL 客户端参数

MySQL 客户端连接 MatrixOne Server 时,需要通过 --ssl-mode 参数指定加密连接行为,如:

  1. mysql -h 127.0.0.1 -P 6001 -udump -p111 --ssl-mode=PREFFERED

ssl mode 取值类型如下:

ssl-mode 取值含义
DISABLED不使用 SSL/TLS 建立加密连接,与 skip-ssl 同义。
PREFFERED默认行为,优先尝试使用 SSL/TLS 建立加密连接,如果无法建则尝试建立非 SSL/TLS 连接。
REQUIRED只会尝试使用 SSL/TLS 建立加密连接,如果无法建立连接,则会连接失败。
VERIFY_CA与 REQUIRED 行为一样,并且还会验证 Server 端的 CA 证书是否有效。
VERIFY_IDENTITY与 VERIFY_CA 行为一样,并且还验证 Server 端 CA 证书中的 host 是否与实际连接的 hostname 是否一致。

Note

客户端在指定了 --ssl-mode=VERIFY_CA 时,需要使用 --ssl-ca 来指定 CA 证书。 客户端在指定了 --ssl-mode=VERIFY_IDENTITY 时,需要指定 CA 证书,且需要使用 --ssl-key 指定客户端的私钥和使用 --ssl-cert 指定客户端的证书。