外观
OceanBase 传输加密
TLS/SSL 证书准备
1. 证书类型选择
OceanBase 支持两种证书类型:
- 自签名证书:适合测试环境,不推荐在生产环境使用
- CA 签发证书:适合生产环境,由可信 CA 机构签发
2. 证书生成方式
2.1 使用 OpenSSL 生成自签名证书
bash
# 创建证书目录
mkdir -p /home/oceanbase/ssl
cd /home/oceanbase/ssl
# 生成 CA 私钥
openssl genrsa -out ca.key 4096
# 生成 CA 证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=OceanBase CA"
# 生成服务器私钥
openssl genrsa -out server.key 2048
# 生成服务器 CSR
openssl req -new -key server.key -out server.csr -subj "/CN=observer" -addext "subjectAltName = DNS:observer,IP:127.0.0.1,IP:xxx.xxx.xxx.xxx"
# 使用 CA 签署服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extensions v3_ext
# 生成客户端私钥
openssl genrsa -out client.key 2048
# 生成客户端 CSR
openssl req -new -key client.key -out client.csr -subj "/CN=client"
# 使用 CA 签署客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha2562.2 使用 OCP 生成证书
- 登录 OCP 控制台
- 在左侧导航栏中选择 "系统管理" > "证书管理"
- 点击 "创建证书"
- 选择证书类型(自签名或 CA 签发)
- 配置证书参数(有效期、密钥长度、Subject 等)
- 点击 "生成",下载证书文件
3. 证书文件说明
| 证书文件 | 用途 | 位置 |
|---|---|---|
| ca.crt | CA 证书,用于验证服务器和客户端证书 | 所有节点 |
| server.crt | 服务器证书,用于服务器身份认证 | OceanBase 节点和 OBProxy 节点 |
| server.key | 服务器私钥,用于加密通信 | OceanBase 节点和 OBProxy 节点 |
| client.crt | 客户端证书,用于客户端身份认证 | 客户端 |
| client.key | 客户端私钥,用于加密通信 | 客户端 |
4. 证书权限设置
bash
# 设置证书文件权限
chmod 600 /home/oceanbase/ssl/*.key
chmod 644 /home/oceanbase/ssl/*.crt
chmod 644 /home/oceanbase/ssl/*.csr
# 设置证书目录权限
chmod 755 /home/oceanbase/ssl
# 更改证书文件所有者
chown -R oceanbase:oceanbase /home/oceanbase/ssl配置客户端与 OBProxy 之间的加密
1. OBProxy 配置
编辑 OBProxy 配置文件 obproxy.conf:
yaml
# 启用 TLS/SSL
enable_ssl = true
# SSL 证书文件路径
ssl_cert_path = /home/obproxy/ssl/server.crt
ssl_key_path = /home/obproxy/ssl/server.key
ssl_ca_path = /home/obproxy/ssl/ca.crt
# SSL 协议版本
ssl_min_protocol_version = TLSv1.2
ssl_max_protocol_version = TLSv1.3
# SSL 加密套件
ssl_ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256"
# 启用客户端证书验证
ssl_verify_client = optional2. 客户端配置
2.1 MySQL 客户端配置
bash
# 使用 SSL 连接 OBProxy
mysql -h127.0.0.1 -P2883 -uroot@sys#obcluster -p'root@123' \
--ssl-ca=/home/client/ssl/ca.crt \
--ssl-cert=/home/client/ssl/client.crt \
--ssl-key=/home/client/ssl/client.key \
--ssl-mode=VERIFY_IDENTITY \
-A oceanbase2.2 JDBC 客户端配置
java
// JDBC URL 配置
String url = "jdbc:mysql://obproxy:2883/oceanbase?useSSL=true&requireSSL=true&verifyServerCertificate=true&sslCA=/home/client/ssl/ca.crt&sslCert=/home/client/ssl/client.crt&sslKey=/home/client/ssl/client.key";
// 创建连接
Connection conn = DriverManager.getConnection(url, username, password);3. 验证加密连接
sql
-- 查看连接是否使用 SSL
SHOW STATUS LIKE 'Ssl_cipher';
-- 查看 SSL 连接详细信息
SHOW SESSION STATUS LIKE 'Ssl%';配置 OBProxy 与 OceanBase 集群之间的加密
1. OceanBase 集群配置
1.1 修改集群配置
sql
-- 启用 SSL
ALTER SYSTEM SET enable_ssl = true SCOPE = BOTH;
-- 设置 SSL 证书路径
ALTER SYSTEM SET ssl_cert_path = '/home/oceanbase/ssl/server.crt' SCOPE = BOTH;
ALTER SYSTEM SET ssl_key_path = '/home/oceanbase/ssl/server.key' SCOPE = BOTH;
ALTER SYSTEM SET ssl_ca_path = '/home/oceanbase/ssl/ca.crt' SCOPE = BOTH;
-- 设置 SSL 协议版本
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2' SCOPE = BOTH;
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3' SCOPE = BOTH;
-- 设置 SSL 加密套件
ALTER SYSTEM SET ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' SCOPE = BOTH;1.2 重启 Observer 进程
bash
# 重启所有 Observer 进程
obd cluster restart <cluster-name>2. OBProxy 配置
编辑 OBProxy 配置文件 obproxy.conf:
yaml
# 启用与 OceanBase 集群的 SSL 连接
enable_ssl_client = true
# SSL 证书文件路径
ssl_client_cert_path = /home/obproxy/ssl/client.crt
ssl_client_key_path = /home/obproxy/ssl/client.key
ssl_client_ca_path = /home/obproxy/ssl/ca.crt
# SSL 协议版本
ssl_client_min_protocol_version = TLSv1.2
ssl_client_max_protocol_version = TLSv1.3
# SSL 加密套件
ssl_client_ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"3. 验证加密连接
sql
-- 查看 OceanBase 节点 SSL 状态
SELECT * FROM oceanbase.__all_virtual_ssl_status;
-- 查看 OBProxy 与 OceanBase 之间的连接状态
SHOW PROCESSLIST;配置 OceanBase 集群内部加密
1. 集群内部加密配置
sql
-- 启用集群内部 SSL
ALTER SYSTEM SET enable_ssl_internal = true SCOPE = BOTH;
-- 设置内部 SSL 证书路径
ALTER SYSTEM SET ssl_cert_path = '/home/oceanbase/ssl/server.crt' SCOPE = BOTH;
ALTER SYSTEM SET ssl_key_path = '/home/oceanbase/ssl/server.key' SCOPE = BOTH;
ALTER SYSTEM SET ssl_ca_path = '/home/oceanbase/ssl/ca.crt' SCOPE = BOTH;
-- 设置内部 SSL 协议版本
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2' SCOPE = BOTH;
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3' SCOPE = BOTH;
-- 设置内部 SSL 加密套件
ALTER SYSTEM SET ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' SCOPE = BOTH;2. 重启 Observer 进程
bash
# 重启所有 Observer 进程
obd cluster restart <cluster-name>3. 验证内部加密连接
sql
-- 查看集群内部 SSL 状态
SELECT * FROM oceanbase.__all_virtual_ssl_status;
-- 查看节点间连接状态
SELECT * FROM oceanbase.__all_virtual_server_stat WHERE svr_ip = 'xxx.xxx.xxx.xxx';TLS/SSL 证书管理
1. 证书有效期监控
sql
-- 查看证书有效期
SHOW PARAMETERS LIKE '%ssl%cert%';
-- 使用 OpenSSL 查看证书有效期
openssl x509 -in /home/oceanbase/ssl/server.crt -noout -dates2. 证书更新流程
- 生成新证书:使用相同的 CA 或新 CA 生成新证书
- 部署新证书:将新证书部署到所有节点
- 更新配置:更新 OceanBase 和 OBProxy 的证书路径配置
- 重启服务:重启 OceanBase 节点和 OBProxy 服务
- 验证连接:验证客户端和服务端之间的加密连接
3. 证书自动更新
在生产环境中,建议使用自动化工具管理证书更新,如:
- cert-manager:Kubernetes 环境下的证书管理工具
- HashiCorp Vault:用于证书生成、存储和自动更新
- 自定义脚本:定期检查证书有效期并自动更新
性能优化
1. 加密性能影响
启用 TLS/SSL 会对系统性能产生一定影响,主要包括:
- CPU 消耗增加:加密和解密操作会消耗额外的 CPU 资源
- 网络延迟增加:加密数据会增加网络传输量
- 连接建立时间增加:TLS 握手过程会增加连接建立时间
2. 性能优化措施
2.1 硬件优化
- 使用支持 AES-NI 指令集的 CPU,提高加密性能
- 增加 CPU 核心数,分摊加密计算负载
- 使用高速存储设备,提高证书读取性能
2.2 配置优化
sql
-- 选择高效的加密套件
ALTER SYSTEM SET ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' SCOPE = BOTH;
-- 启用会话复用
ALTER SYSTEM SET ssl_session_cache_size = 10000 SCOPE = BOTH;
ALTER SYSTEM SET ssl_session_timeout = 3600 SCOPE = BOTH;
-- 调整 SSL 缓冲区大小
ALTER SYSTEM SET ssl_buffer_size = 8192 SCOPE = BOTH;2.3 连接管理优化
- 使用连接池,减少 TLS 握手次数
- 调整连接超时时间,避免频繁重建连接
- 启用长连接,减少连接建立开销
安全最佳实践
1. 证书安全
- 保护私钥安全:私钥文件权限设置为 600,仅允许所有者访问
- 定期更换证书:证书有效期建议设置为 1 年,定期更换
- 使用强密钥长度:推荐使用 2048 位或以上的 RSA 密钥
- 限制证书用途:根据实际需要设置证书的 Subject Alternative Name
2. 协议安全
- 禁用旧版本协议:禁用 TLSv1.0 和 TLSv1.1,仅使用 TLSv1.2 和 TLSv1.3
- 使用安全的加密套件:选择支持前向 secrecy的加密套件
- 启用证书验证:始终验证服务器证书,避免中间人攻击
3. 配置安全
- 启用完整的加密链:客户端到 OBProxy、OBProxy 到 OceanBase、OceanBase 内部节点之间都启用加密
- 使用不同的证书:为客户端、OBProxy 和 OceanBase 集群使用不同的证书
- 定期审计配置:定期检查加密配置,确保符合安全要求
- 启用日志记录:记录 SSL 连接信息,便于审计和故障排查
4. 密钥管理
- 使用硬件安全模块(HSM):将私钥存储在 HSM 中,提高密钥安全性
- 实现密钥轮换机制:定期更换密钥,减少密钥泄露风险
- 建立密钥备份策略:安全备份密钥,防止密钥丢失
常见问题(FAQ)
Q1: 启用 TLS/SSL 后连接变慢怎么办?
A1: 启用 TLS/SSL 后连接变慢可能有以下原因:
- CPU 资源不足:加密操作消耗大量 CPU 资源,建议增加 CPU 核心数
- 密钥长度过长:使用 2048 位 RSA 密钥即可,不需要更长的密钥
- 加密套件效率低:选择高效的加密套件,如 ECDHE-RSA-AES256-GCM-SHA384
- 连接建立频繁:使用连接池,减少 TLS 握手次数
- 证书验证开销大:优化证书验证过程,或使用证书缓存
Q2: 如何排查 TLS/SSL 连接失败问题?
A2: 排查 TLS/SSL 连接失败问题可以按照以下步骤进行:
- 检查证书文件路径和权限是否正确
- 检查证书有效期是否过期
- 检查证书的 Subject 和 Subject Alternative Name 是否匹配服务器地址
- 检查 SSL 协议版本和加密套件是否兼容
- 查看 OceanBase 和 OBProxy 日志,查找 SSL 相关错误信息
- 使用 OpenSSL 工具测试 SSL 连接:
openssl s_client -connect 127.0.0.1:2881 -CAfile /home/client/ssl/ca.crt
Q3: 自签名证书和 CA 签发证书有什么区别?
A3: 自签名证书和 CA 签发证书的主要区别:
- 信任级别:CA 签发证书由可信 CA 机构签发,客户端默认信任;自签名证书需要手动信任
- 安全性:CA 签发证书安全性更高,自签名证书容易被伪造
- 适用场景:自签名证书适合测试环境,CA 签发证书适合生产环境
- 管理复杂度:自签名证书管理简单,CA 签发证书管理复杂
Q4: 如何在不中断服务的情况下更新证书?
A4: 在不中断服务的情况下更新证书可以按照以下步骤进行:
- 生成新证书,确保新证书与旧证书的 Subject 和 Subject Alternative Name 相同
- 将新证书部署到所有节点,与旧证书共存
- 更新配置,指向新证书路径
- 逐个重启 OceanBase 节点和 OBProxy 服务,实现滚动更新
- 验证所有节点都使用新证书后,删除旧证书
Q5: 如何监控 TLS/SSL 连接状态?
A5: 可以通过以下方式监控 TLS/SSL 连接状态:
- OceanBase 内置视图:
__all_virtual_ssl_status视图显示 SSL 连接状态 - OBProxy 日志:OBProxy 日志中包含 SSL 连接信息
- 监控工具:OCP、Prometheus 等监控工具提供 SSL 连接监控指标
- OpenSSL 工具:使用
openssl s_client命令测试 SSL 连接
Q6: 启用 TLS/SSL 后如何支持旧版本客户端?
A6: 支持旧版本客户端可以采取以下措施:
- 配置兼容的 SSL 协议版本,如同时支持 TLSv1.2 和 TLSv1.3
- 配置兼容的加密套件,包含旧版本客户端支持的套件
- 为旧版本客户端提供单独的连接端口,不启用 SSL
- 升级旧版本客户端,支持最新的 TLS 协议
Q7: 如何配置双向认证?
A7: 配置双向认证需要以下步骤:
- 生成客户端证书和服务器证书
- 配置服务器验证客户端证书:
ssl_verify_client = required - 配置客户端验证服务器证书
- 部署客户端证书到所有客户端
- 验证双向认证是否生效
Q8: TLS/SSL 与数据加密有什么区别?
A8: TLS/SSL 与数据加密的主要区别:
- 加密范围:TLS/SSL 加密传输过程中的数据,数据加密加密存储在磁盘上的数据
- 加密对象:TLS/SSL 加密网络通信,数据加密加密数据库中的数据
- 实现方式:TLS/SSL 使用公开密钥加密,数据加密使用对称密钥加密
- 安全目标:TLS/SSL 防止数据在传输过程中被窃听,数据加密防止数据在存储过程中被窃取
