本文介绍 Lindorm 宽表引擎 MySQL 协议 33060 端口的 SSL/TLS 加密链路使用方式。
版本要求
宽表 >= 2.8.6.14 并且 SQL 版本 >= 2.9.7.16
适用范围
本文说明 Lindorm 宽表引擎 MySQL 协议 33060 端口的 SSL/TLS 加密链路使用方式,覆盖以下场景:
客户端只要求链路加密:使用
sslMode=REQUIRED。客户端要求基于 CA 证书校验服务端证书链:使用
sslMode=VERIFY_CA并配置控制台下载的 CA 证书。JDBC 客户端需要使用 CA 证书严格校验时,将 CA 证书导入 truststore 后连接。
控制台开通 SSL 加密服务
前提条件
已开通 Lindorm 宽表引擎。
操作步骤
登录Lindorm管理控制台。
在页面左上角,选择实例所属的地域。
在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理。
在实例详情页左侧导航栏,依次单击。
在数据链路SSL区域,在当前状态:区域进行开启操作。
等待 SSL 加密服务开通完成。页面显示以下信息时,表示 SSL 加密服务已开启:
当前状态::已开启
SSL证书有效期::页面展示的证书过期时间,例如
2036-06-13 18:02:25SSL证书有效性::有效
页面提供下 载 CA 证 书按钮
客户端如果要使用 VERIFY_CA 严格校验,需要单击下 载 CA 证 书获取 CA 证书文件。
客户端连接模式
只要求加密链路
若仅需保障客户端到服务端的链路加密,使用 sslMode=REQUIRED。该模式会启用 TLS 加密,但无需客户端额外配置 CA 根证书。
MySQL 命令示例
mysql --ssl-mode=REQUIRED \ -h <host> \ -P 33060 \ -u <user> \ -p \ -D <database> \ --get-server-public-key详细使用方式可参见通过MySQL命令行连接并使用宽表引擎。
JDBC示例
String url = "jdbc:mysql://<host>:33060/<database>" + "?sslMode=REQUIRED" + "&allowPublicKeyRetrieval=true"; Connection connection = DriverManager.getConnection(url, user, password);详细使用方式可参见基于Java JDBC接口的应用开发。
严格校验证书链
如果客户端需要确认服务端证书由可信 CA 签发,使用 sslMode=VERIFY_CA,并通过 --ssl-ca 指定控制台下载的 CA 证书。
mysql --ssl-mode=VERIFY_CA \
--ssl-ca=/path/to/Lindorm-CA.crt \
-h <host> \
-P 33060 \
-u <user> \
-p \
-D <database> \
--get-server-public-key示例查询:
mysql --ssl-mode=VERIFY_CA \
--ssl-ca=/path/to/Lindorm-CA.crt \
-h <host> -P 33060 -u <user> -p -D <database> \
--get-server-public-key \
-e "SELECT 1 AS ok"请将示例中的/path/to/Lindorm-CA.crt 替换为 Lindorm-CA.crt 文件在您本地环境中的实际绝对路径。
返回 ok = 1 表示客户端已基于 CA 证书完成 SSL 握手和查询。
VERIFY_IDENTITY 模式说明
VERIFY_IDENTITY 会在 VERIFY_CA 的基础上继续校验连接域名是否匹配服务端证书的 SAN/CN。因此,使用该模式的前提是:客户端连接时使用的 host 必须与证书中声明的域名或 IP 完全一致。
JDBC 严格 CA 校验
MySQL Connector/J 通用做法是先把控制台下载的 CA 证书导入 Java truststore,再在 JDBC URL 中配置 truststore。
生成 truststore
keytool -importcert \
-alias lindorm-ca \
-file /path/to/Lindorm-CA.crt \
-keystore /path/to/lindorm-ca.p12 \
-storetype PKCS12 \
-storepass changeit \
-noprompt请将示例中的
/path/to/Lindorm-CA.crt替换为该证书文件在您本地环境中的实际绝对路径。请将示例中的
/path/to/lindorm-ca.p12替换为您计划在本地环境中保存该文件的实际绝对路径。
JDBC URL
String url = "jdbc:mysql://<host>:33060/<database>"
+ "?sslMode=VERIFY_CA"
+ "&allowPublicKeyRetrieval=true"
+ "&trustCertificateKeyStoreUrl=file:/path/to/lindorm-ca.p12"
+ "&trustCertificateKeyStorePassword=changeit"
+ "&trustCertificateKeyStoreType=PKCS12";
Connection connection = DriverManager.getConnection(url, user, password);注意:trustCertificateKeyStoreUrl 使用的是 truststore 文件路径,不是直接填写服务端证书路径。控制台下载的 CA 证书可以先导入 PKCS12 或 JKS truststore 后再给 JDBC 使用。
常见问题
Q:SSL 加密是否控制台开通以后就能够生效
A:SSL 加密是否开通是服务端和客户端协商决定的,需要在客户端配置 sslMode 来协商决定。
Q:SSL 加密是否有性能损耗
A:开通 SSL 加密会有性能损耗,对于性能敏感场景,建议禁用 SSL 加密,可以在连接串中设置
sslMode=DISABLED来禁用 SSL 加密。Q:只配置证书路径是否会自动开启 SSL
A:不会。服务端必须开启对应 SSL 开关后,MySQL 协议 SSL 链路才会启用。
Q:REQUIRED 和 VERIFY_CA 有什么区别
A:
REQUIRED只要求建立 TLS 加密链路,不要求客户端校验服务端证书链。VERIFY_CA除了建立 TLS 加密链路,还要求客户端信任签发服务端证书的 CA 根证书。Q:--ssl-ca 应该填写哪个证书
A:填写控制台
下载 CA 证书得到的 CA 根证书。不要把服务端证书server.cert直接当作--ssl-ca使用。Q:JDBC 可以直接使用 crt 文件吗
A:不同 MySQL Connector/J 版本对 PEM 证书参数的支持存在差异。通用做法是将控制台下载的 CA 证书导入 PKCS12 或 JKS truststore,然后通过
trustCertificateKeyStoreUrl、trustCertificateKeyStorePassword、trustCertificateKeyStoreType配置给 JDBC。