show status like 'ssl_cipher' 返回非空值才是当前连接启用tls的唯一可信依据,空值即明文;status命令中“cipher in use is”行同理;performance_schema.status_by_thread可编程验证;tcpdump抓包为终极物理层确认。

SHOW STATUS LIKE 'Ssl_cipher' 是唯一可信依据
配置再全、证书再对、REQUIRE SSL 写得再标准,只要 SHOW STATUS LIKE 'Ssl_cipher' 返回空值('' 或 NULL),当前连接就没走加密。这是最直接、不可绕过的验证点——它反映的是真实握手结果,不是配置状态。
注意:SHOW VARIABLES LIKE 'have_ssl' 只表示“编译支持”,SHOW VARIABLES LIKE 'ssl_ca' 只表示“配了路径”,二者都≠当前连接已加密。
- 执行
SHOW STATUS LIKE 'Ssl_cipher';,返回非空字符串(如ECDHE-ECDSA-AES256-SHA)才代表 TLS 已启用 - 如果返回空,说明连接是明文的,哪怕你用了
--ssl-mode=REQUIRED - 同一实例下不同用户、不同客户端、甚至同一条命令加不加参数,加密状态都可能不同,必须针对当前会话查
STATUS 命令里看 Cipher in use is 这一行
MySQL 命令行客户端连上后,直接输入 STATUS;(或简写 \s),输出末尾会有一段连接信息。重点找这一行:
Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
有这行且后面跟着具体算法名,就说明当前连接正在用 TLS;没有这行,或者写着 Cipher in use is (none),就是明文。
- 这个输出比
SHOW STATUS更直观,适合快速确认 - 它只反映当前会话,新开一个终端重连就得重新查
- 某些旧版客户端(如老版本 PHP CLI)可能不显示该字段,此时必须依赖
SHOW STATUS LIKE 'Ssl_cipher'
performance_schema.status_by_thread 查线程级加密状态
如果你在写监控脚本或排查某个特定应用连接是否加密,不能只靠交互式 STATUS,得查系统表:
SELECT VARIABLE_VALUE FROM performance_schema.status_by_thread WHERE THREAD_ID = CONNECTION_ID() AND VARIABLE_NAME = 'Ssl_cipher';
返回非空值即为加密;为空则未加密。
-
CONNECTION_ID()确保查的是当前连接对应线程,避免跨会话误判 - 该表在 MySQL 5.7+ 默认开启,但需确保
performance_schema没被禁用(SHOW VARIABLES LIKE 'performance_schema';应为ON) - 比抓包轻量,比
STATUS更适合自动化判断
tcpdump + Wireshark 抓包是终极验证手段
所有 SQL 和密码都以明文出现在 TCP 流中?那肯定没加密。这是绕过所有配置和状态检查的物理层验证方式。
- 在服务器本地执行:
sudo tcpdump -i lo port 3306 -w mysql.pcap(仅抓回环流量,避免干扰) - 用客户端连一次,执行一条简单查询(如
SELECT 1;),然后 Ctrl+C 停止抓包 - 用 Wireshark 打开
mysql.pcap,过滤mysql,展开 TCP payload —— 如果能看到SELECT 1或明文密码,说明完全没加密 - 加密连接里只能看到 TLS handshake 和密文块,payload 不可读
真正难的不是配 SSL,而是确认它真在跑。很多问题出在服务端证书路径错、客户端降级、或连到了没配 SSL 的另一个实例上——这些都得靠实时状态或抓包来戳破。











