Debian 12 环境下启用TLS后,本地连接MariaDB 11.5.2 提示主机名验证失败
看起来你遇到的问题核心是TLS证书的主机名验证逻辑在起作用,咱们一步步把它捋清楚:
问题根源
你在客户端配置50-client.cnf里开启了ssl-verify-server-cert,这个选项会强制MariaDB客户端检查服务器证书中包含的主机名(或SAN主题备用名称字段),必须和你连接时使用的主机名完全匹配:
- 当你用
localhost或127.0.0.1连接时,客户端会拿这个地址和证书里的hostname.tld对比,显然不匹配,所以抛出「Hostname verification failed」错误; - 而指定
host=hostname.tld连接时,主机名和证书信息完全一致,验证通过,所以能正常连接,且从你看到的TLS_AES_256_GCM_SHA384加密套件也能确认TLS确实在工作。
解决方案
根据你的使用需求,有两种可选方案:
方案1:保留本地无FQDN的连接(localhost/127.0.0.1)
如果你希望继续用localhost/127.0.0.1连接,同时保留远程连接的证书验证安全性,可以给本地连接单独配置跳过主机名验证:
修改/etc/mysql/mariadb.conf.d/50-client.cnf,添加一个针对本地连接的配置段:
[client-mariadb] ssl ssl-verify-server-cert # 针对本地连接的特殊配置 [client-mariadb-local] host=localhost ssl ssl-verify-server-cert=0
之后本地连接时,使用这个特殊配置组:
mariadb --defaults-group-suffix=-local -p -u root
这样本地连接会跳过主机名验证,但远程连接依然会强制验证证书主机名,兼顾安全性和便利性。
另一种更彻底的方法是给服务器证书添加本地地址的SAN字段:重新申请证书时,在CSR(证书签名请求)里加入DNS:localhost和IP:127.0.0.1作为主题备用名称,这样证书里同时包含你的FQDN和本地地址,无论用哪种方式连接都能通过验证。
方案2:统一使用FQDN连接
如果可以接受必须用FQDN连接数据库,你可以直接把客户端配置默认主机设为你的域名:
修改/etc/mysql/mariadb.conf.d/50-client.cnf:
[client-mariadb] host=hostname.tld ssl ssl-verify-server-cert
之后直接执行mariadb -p -u root就会自动用FQDN连接,无需每次手动指定-h参数。
验证TLS连接状态
不管用哪种方案,连接成功后都可以执行以下命令确认TLS是否正常启用:
SHOW SESSION STATUS LIKE 'Ssl_cipher';
如果返回非空的加密套件值(比如你之前看到的TLS_AES_256_GCM_SHA384),就说明TLS连接正常工作。
备注:内容来源于stack exchange,提问作者Powerriegel

