首批通过分布式安全可靠测评,为关键业务系统打造
OBServer 传输加密
更新时间:2026-04-16 13:09:50
OBServer 节点、liboblog、obadmin 等组件的底层通信均依赖 Libeasy 库,因此支持的私钥/证书加载方式均相同(本地文件模式),即将 CA 证书、用户证书、私钥放在 wallet 文件夹下,根据配置项开启时从该目录下读取加载。
开启方式
OBServer 传输加密的开启通过多个配置项配合使用。
使用 root 用户登录数据库的 sys 租户。
指定私钥/证书/CA 证书的获取方式。
说明
OceanBase 数据库社区版在配置 OBServer 传输加密时请忽略该步骤。
ALTER SYSTEM SET ssl_external_kms_info = ' { "ssl_mode":"file" }';配置 MySQL 端口 SSL 通信。
默认 MySQL 端口 SSL 通信是关闭的。先需要指定 SSL 协议的版本号后开启 SSL 通信,修改后实时生效。
可以通过配置项
sql_protocol_min_tls_version指定 SSL 协议的版本号。目前支持的 SSL 协议的版本号包括 TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3,当指定版本号后,支持指定的版本号及其以上的版本协议。有关开启 SSL 连接的更多信息,请参见 sql_protocol_min_tls_version。ALTER SYSTEM SET sql_protocol_min_tls_version = 'TLSv1.1';可以通过配置项
ssl_client_authentication开启 SSL 连接。有关开启 SSL 连接的更多信息,请参见 ssl_client_authentication。--配置为 TRUE 后,MySQL 通信 SSL 即时开启 ALTER SYSTEM SET ssl_client_authentication = 'TRUE';
配置 RPC 通信的 SSL 白名单,由于 OBServer 之间 TCP 连接都是长连接,因此需要重启 OBServer 后 RPC SSL 加密通信才能开启。
--rpc 通信 ssl 需要配置白名单 --整个集群都开启 ALTER SYSTEM SET _ob_ssl_invited_nodes='ALL'; --指定 ip 的 observer 开启 ssl ALTER SYSTEM SET _ob_ssl_invited_nodes='135.xxx.xx.xx, 128.xxx.xx.xx';
配置 TLS 免密认证
在不需要验证 OBserver 身份的情况下,TLS 免密认证允许客户端不加载 CA 证书,否则需要加载 CA 证书。本节介绍如何配置和使用 TLS 免密认证。
配置步骤
配置证书
确保 CA 证书文件(ca.pem)包含双方的证书信息。内容如下:
CopyInsert // ca.pem 文件内容示例 -----BEGIN CERTIFICATE----- // OBserver 的 CA 证书 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- // 客户端的 CA 证书 -----END CERTIFICATE-----示例:
-----BEGIN CERTIFICATE----- MIIDpzCCAo+gAwIBAgIJALjo7NLQCbMwMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV BAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRkwFwYDVQQHDBBIYWlkaWFuIERpc3Ry aWN0MQswCQYDVQQKDAJPQjEMMAoGA1UECwwDc3lzMRMwEQYDVQQDDAp3emhfY2Ff cGVtMB4X -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAzCCAeugAwIBAgIBATANBgkqhkiG9w0BAQsFADA8MTowOAYDVQQDDDFNeVNR TF9TZXJ2ZXJfNS43LjI0X0F1dG9fR2VuZXJhdGVkX0NBX0NlcnRpZmljYXRlMB4X DTE5MDQyOTA5MDc1NVoXDTI5MDQyNjA5MDc1NVowPDE6MDgGA1UEAwwxTXlTUUxf U2VydmVy -----END CERTIFICATE-----提取证书信息
提取证书的
SUBJECT和ISSUER字段,格式化为文件路径样式。// SUBJECT $ openssl x509 -noout -subject -in client-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//' /C=CN/ST=Beijing/L=Haidian District/O=OB/OU=sys/CN=client_pem // ISSUER $ openssl x509 -noout -issuer -in client-cert.pem | sed 's/.\{7\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//' /C=CN/ST=Beijing/L=Haidian District/O=OB/OU=sys/CN=ca_pem创建用户
连接数据库后,创建用户时使用
REQUIRE字段指定证书。没有指定密码的情况下,默认密码为空。CREATE USER tony user tony require SUBJECT '/C=CN/ST=Beijing/L=Haidian District/O=OB/OU=sys/CN=client_pem';使用证书登录
$obclient -h100.88.109.171 -P28205 -uuser1@sys --ssl-ca=/home/user1/wallet2/ca.pem --ssl-cert=/home/user1/wallet2/client-cert.pem --ssl-key=/home/user1/wallet2/client-key.pem返回结果如下:
Welcome to the OceanBase monitor. Commands end with ; or \g. Your OceanBase connection id is 3221503926 Server version: 5.7.25 OceanBase 4.2.5.1 (r1-9e815083770a3f4a7c9bffd93493d96b58aea72f) (Built Nov 11 2024 11:52:31) Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
常见问题说明
- 证书认证方式
- 双向认证:客户端指定
--ssl-ca时,双方都需要验证对方的证书。 - 单向认证:客户端不指定
--ssl-ca时,只有 OBserver 验证客户端证书。
- 可能的登录失败原因
- 空密码登录失败:TLS 免密认证必须使用证书。空密码登录会报错
ERROR 1045 (42000): Access denied for user 'tony'@'xxx.xxx.xxx.xxx' (using password: NO)。 - 证书验证失败:
- 客户端指定
--ssl-ca进行双向认证时,OBserver 的ca.pem未包含客户端的 CA 证书,或客户端的ca.pem未包含 OBserver 的 CA 证书,会报错ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)。 - 证书格式不正确或已过期。
- 客户端指定
OBServer 如何确定通信加密开启成功
最简单的方法是对 MySQL 端口和 RPC 端口进行抓包,查看是否开启加密,此外可以通过以下方式:
OBClient/MySQL 客户端登录 OBServer,系统租户检索
oceanbase.GV$OB_SERVERS视图的ssl_cert_expired_time字段确认是否开启。该字段记录当前 OBServer 开启 SSL 时,当前 OBServer 使用的 SSL 证书过期时间,utc 时间,单位微秒。
obclient> select svr_ip, svr_port,zone, ssl_cert_expired_time, from_unixtime(ssl_cert_expired_time/1000000) from oceanbase.GV$OB_SERVERS; +--------------+----------+-------+----------------------+---------------------------------------------+ | svr_ip | svr_port | zone | ssl_cert_expired_time | from_unixtime(ssl_key_expired_time/1000000) | +--------------+----------+-------+----------------------+---------------------------------------------+ | 100.xx.xx.xx | 13212 | zone1 | 1871860075 | 2029-04-26 09:07:55 | +--------------+----------+-------+----------------------+---------------------------------------------+ 1 row in set (0.00 sec)
检查 MySQL 端口是否开启 SSL
通过 MySQL 客户端/OBClient 登录,执行\s查看 SSL 字段的示例如下:
obclient> \s
--------------
obclient Ver 1.1.8 Distrib 5.7.24, for Linux (x86_64) using EditLine wrapper
Connection id: 3221506046
Current database: test
Current user: root@xx.xx.xx.39
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
Current pager: less
Using outfile: ''
Using delimiter: ;
Server version: 5.7.25 OceanBase 2.2.60 (r1-63cbd3084a3283523f09d6ba20795f77b95e046b) (Built Jun 30 2020 10:10:29)
Protocol version: 10
Connection: xx.xx.xx.189 via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
TCP port: 13213
Active --------------
检查 RPC 端口是否开启 SSL
在 OBServer.log 中的日志,搜索关键字 "rpc connection accept" 查看 use_ssl 的值是 True 还是 False 来判定 RPC SSL 是否开启成功。
说明
对于 RPC 连接,目前重启集群才能生效,或者不重启集群断开已有 RPC 连接才生效。