You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数上,按以下步骤排查:

  1. 检查服务器SSL强制配置与绑定地址

    • 执行SHOW VARIABLES LIKE 'require_secure_transport';,若值为ON,所有连接必须使用SSL,客户端未正确配置证书会直接失败;若为OFF,服务器允许非SSL连接,但仅在客户端主动请求时启用SSL。
    • 确认bind-address参数(在my.cnf的[mysqld]段)是否绑定了远程可访问的IP(如0.0.0.0或具体公网/内网IP),而非仅localhost,否则远程客户端无法连接。
  2. 验证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
      
  3. 显式配置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';确认配置生效。

  4. 测试远程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端口:
      openssl s_client -connect <服务器IP>:3306 -CAfile /etc/certs/ca-cert.pem
      
      查看输出中的SSL握手过程,确认是否有证书不匹配、协议版本不兼容等错误。
  5. 检查网络与防火墙

    • 测试3306端口连通性:执行telnet <服务器IP> 3306或nc -zv <服务器IP> 3306,确保端口对外开放。
    • 检查服务器防火墙规则(如ufw、iptables),确认已允许3306端口的TCP入站连接。
  6. 启用详细日志排查
    若日志无报错,调整日志级别以获取更多细节:在my.cnf的[mysqld]段添加:

    log_error_verbosity = 3
    

    重启服务后再次尝试客户端连接,查看错误日志(通常路径为/var/log/mysql/error.log),查找隐藏的SSL相关错误。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:40:54