一、前言
在数据库系统的日常运维中,数据传输安全是保障业务稳健运行的关键一环。默认情况下,TiDB 服务端与客户端之间采用非加密连接,这意味着第三方如果能够监控信道流量,就可能获取双方发送和接收的数据,其中包括查询语句内容、查询结果等敏感信息。尤其当客户端通过公网连接到 TiDB 服务端时,非加密连接存在较大的信息泄露风险。为了有效应对这一安全挑战,TiDB 提供了基于 TLS 协议的加密连接支持。开启加密传输后,客户端与服务端之间的通信能够获得多重安全保障:流量明文会被加密以防止窃听,数据完整性得以保护以防止篡改,并且可选地进行双方身份验证,以有效规避中间人攻击。本文将系统介绍为 TiDB 客户端与服务端间通信开启加密传输的几种主要方法。
二、创建一个干净的目录来存放所有证书文件
mkdir -p ~/tls_certs && cd ~/tls_certs
三、生成 CA 私钥和证书
cd ~/tls_certs
openssl genrsa -out ca-key.pem 2048
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=TiDB/OU=DB/CN=TiDB CA"
ls -la ca*.pem
四、生成服务端私钥和证书签名请求
openssl genrsa -out server-key.pem 2048
openssl req -new -key server-key.pem -out server-req.pem -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=TiDB/OU=DB/CN=192.168.2.80"
五、用 CA 签署服务端证书
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
ls -la server*.pem
六、生成客户端私钥和证书签名请求
openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client-req.pem -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=TiDB/OU=DB/CN=client"
七、用 CA 签署客户端证书
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
ls -la server*.pem
八、生成客户端私钥和证书签名请求
openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client-req.pem -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=TiDB/OU=DB/CN=client"
九、用 CA 签署客户端证书
openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem
ls -la client*.pem
十、清理临时请求文件(保留证书和私钥)
rm -f server-req.pem client-req.pem ca.srl
十一、验证所有证书
openssl verify -CAfile ca.pem server-cert.pem
openssl verify -CAfile ca.pem client-cert.pem
十二、查看最终文件列表
[tidb@tidb80 tls_certs]$ ls -la
总用量 32
drwxrwxr-x 2 tidb tidb 4096 6月 24 17:13 .
drwx------. 11 tidb tidb 4096 6月 24 17:29 ..
-rw-rw-r-- 1 tidb tidb 1679 6月 24 17:13 ca-key.pem
-rw-rw-r-- 1 tidb tidb 1306 6月 24 17:13 ca.pem
-rw-rw-r-- 1 tidb tidb 1188 6月 24 17:13 client-cert.pem
-rw-rw-r-- 1 tidb tidb 1679 6月 24 17:13 client-key.pem
-rw-rw-r-- 1 tidb tidb 1196 6月 24 17:13 server-cert.pem
-rw-rw-r-- 1 tidb tidb 1679 6月 24 17:13 server-key.pem
十三、集群配置指定手动配置的证书
十四、重启tidb服务器,查看tidb日志输出 mysql protocol server secure connection is enabled
tiup cluster reload tidb-test -R tidb
十五、TiDB 服务端当前的 SSL 相关配置状态
十六、创建用户test1指定 REQUIRE SSL 要求指定用户必须使用 TLS 连接来连接 TiDB
CREATE USER 'test1'@'%' IDENTIFIED BY 'test1' REQUIRE SSL;
grant all privileges on *.* to 'test1'@'%' with grant option;
flush privileges;
mysql -h192.168.2.80 -P4000 -utest1 -ptest1 \
--ssl-ca /home/tidb/tls_certs/ca.pem \
--ssl-cert /home/tidb/tls_certs/client-cert.pem \
--ssl-key /home/tidb/tls_certs/client-key.pem
十七、通过配置系统变量 require_secure_transport 要求所有用户必须使用加密连接来连接到 TiDB
set global require_secure_transport=on;
MySQL [(none)]> show global variables like 'require_secure_transport';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| require_secure_transport | ON |
+--------------------------+-------+
mysql -h192.168.2.80 -P4000 -uroot -proot \
--ssl-ca=/data/tidb-deploy/tidb-4000/tls/ca.crt \
--ssl-cert=/data/tidb-deploy/tidb-4000/tls/tidb.crt \
--ssl-key=/data/tidb-deploy/tidb-4000/tls/tidb.pem
十八、单向 TLS
十九、总结
手动配置证书是生产环境的首选方案。它要求运维人员提前通过权威 CA或内部 PKI 系统生成并配置 ssl-cert 和 ssl-key。虽然操作步骤相对复杂,但它提供了企业级的安全性,支持严格的证书生命周期管理,且能配合 ssl-ca 实现双向身份验证,有效防止中间人攻击。 相对而言,自动生成证书(auto-tls)则极大地降低了入门门槛。通过在配置文件中设置 auto-tls = true,TiDB 在启动时会自动生成自签名证书。此方法“开箱即用”,省去了繁琐的证书申请流程,非常适合开发测试环境或对初期安全要求不高的场景。但需要注意的是,由于不涉及客户端身份验证,其安全防护等级较手动方案有所不及。