MariaDB SSL连接故障排查求助:ssl_cipher为空但OPENSSL与HAVE_SSL均为YES
MariaDB SSL连接排查方案(ssl_cipher为空但SSL组件已启用)
问题描述
客户端无法通过SSL连接MariaDB,排查发现ssl_cipher变量值为空,但have_openssl和have_ssl均显示为YES,且服务器日志无相关报错信息。
已获取的查询信息
SSL变量配置
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%'; +---------------------+----------------------------+ | Variable_name | Value | +---------------------+----------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/certs/ca-cert.pem | | ssl_capath | | | ssl_cert | /etc/certs/server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /etc/certs/server-key.pem | | version_ssl_library | OpenSSL 3.0.2 15 Mar 2022 | +---------------------+----------------------------+ 10 rows in set (0.002 sec)
连接状态信息
MariaDB [(none)]> \s -------------- mysql Ver 15.1 Distrib 10.9.2-MariaDB, for debian-linux-gnu (aarch64) using EditLine wrapper Connection id: 15 Current database: Current user: root@localhost SSL: Cipher in use is TLS_AES_256_GCM_SHA384 Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 10.9.2-MariaDB-1:10.9.2+maria~ubu2204 mariadb.org binary distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /run/mysqld/mysqld.sock Uptime: 1 hour 33 min 32 sec
排查步骤
从本地UNIX socket连接的SSL状态来看,服务器本身具备SSL加密能力,问题集中在远程客户端的SSL连接配置或服务器的远程SSL参数上,按以下步骤排查:
检查服务器SSL强制配置与绑定地址
- 执行
SHOW VARIABLES LIKE 'require_secure_transport';,若值为ON,所有连接必须使用SSL,客户端未正确配置证书会直接失败;若为OFF,服务器允许非SSL连接,但仅在客户端主动请求时启用SSL。 - 确认
bind-address参数(在my.cnf的[mysqld]段)是否绑定了远程可访问的IP(如0.0.0.0或具体公网/内网IP),而非仅localhost,否则远程客户端无法连接。
- 执行
验证SSL证书文件的有效性与权限
- 检查证书文件是否存在:执行
ls -l /etc/certs/ca-cert.pem /etc/certs/server-cert.pem /etc/certs/server-key.pem,确保文件路径正确且文件存在。 - 检查文件权限:MariaDB运行用户(通常为
mysql)需拥有证书文件的读取权限,执行ls -n /etc/certs/查看所属用户组,必要时用chmod 640 /etc/certs/*.pem调整权限,chown mysql:mysql /etc/certs/*.pem修改所属。 - 验证证书链有效性:执行
openssl verify -CAfile /etc/certs/ca-cert.pem /etc/certs/server-cert.pem,返回OK则证书有效,否则证书存在签名问题。 - 检查私钥与证书匹配性:分别执行以下命令,确保输出的哈希值一致:
openssl x509 -noout -modulus -in /etc/certs/server-cert.pem | openssl md5 openssl rsa -noout -modulus -in /etc/certs/server-key.pem | openssl md5
- 检查证书文件是否存在:执行
显式配置ssl_cipher加密套件
当前ssl_cipher为空,可能是服务器未默认启用兼容的加密套件,在my.cnf的[mysqld]段添加:ssl_cipher = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256重启MariaDB服务:
systemctl restart mariadb,再执行SHOW VARIABLES LIKE 'ssl_cipher';确认配置生效。测试远程SSL连接
- 用客户端命令直接测试:
mysql -h <服务器IP> -u <用户名> -p --ssl-mode=REQUIRED --ssl-ca=/etc/certs/ca-cert.pem - 若连接失败,添加
--verbose参数查看详细错误:mysql -h <服务器IP> -u <用户名> -p --ssl-mode=REQUIRED --ssl-ca=/etc/certs/ca-cert.pem --verbose - 用OpenSSL直接测试服务器SSL端口:
查看输出中的SSL握手过程,确认是否有证书不匹配、协议版本不兼容等错误。openssl s_client -connect <服务器IP>:3306 -CAfile /etc/certs/ca-cert.pem
- 用客户端命令直接测试:
检查网络与防火墙
- 测试3306端口连通性:执行
telnet <服务器IP> 3306或nc -zv <服务器IP> 3306,确保端口对外开放。 - 检查服务器防火墙规则(如ufw、iptables),确认已允许3306端口的TCP入站连接。
- 测试3306端口连通性:执行
启用详细日志排查
若日志无报错,调整日志级别以获取更多细节:在my.cnf的[mysqld]段添加:log_error_verbosity = 3重启服务后再次尝试客户端连接,查看错误日志(通常路径为
/var/log/mysql/error.log),查找隐藏的SSL相关错误。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

