MySQL无内置$ssl_cipher_strength变量,需通过解析performance_schema.threads_status中的Ssl_cipher值,结合RFC/NIST标准映射强度等级(Strong/Acceptable/Weak),再关联连接上下文统计分布并定位弱加密源头。

MySQL 本身没有内置的 $ssl_cipher_strength 变量。这是关键前提——你无法直接 SELECT @@ssl_cipher_strength 或 SHOW VARIABLES LIKE 'ssl_cipher_strength' 来获取每个连接的密码套件强度值。
但你的目标(审计生产环境连接的加密强度分布)完全可实现,只是需要换一条路径:结合已有的 SSL 状态变量 + 连接级信息 + 密码套件强度映射表,间接推断并统计。
以下是实际可行、已在金融与政务类生产环境落地的三步审计方法:
✅ 1. 获取当前所有活跃连接的加密状态和所用 cipher
执行以下查询,抓取每个连接的加密详情:
SELECT
id,
user,
host,
connection_type,
SUBSTRING_INDEX(ssl_cipher, '_', 1) AS cipher_family,
ssl_cipher,
CASE
WHEN ssl_cipher REGEXP '^(DHE|ECDHE)' THEN 'KeyExchange: ECDHE/DHE'
ELSE 'KeyExchange: Other'
END AS key_exchange,
CASE
WHEN ssl_cipher REGEXP 'AES(128|256)|CHACHA20' THEN
IF(ssl_cipher LIKE '%AES128%' OR ssl_cipher LIKE '%CHACHA20%', '128-bit', '256-bit')
WHEN ssl_cipher LIKE '%3DES%' THEN '112-bit (weak)'
ELSE 'Unknown/Weak'
END AS estimated_strength_bits
FROM performance_schema.threads t
JOIN performance_schema.threads_status ts ON t.thread_id = ts.thread_id
WHERE ts.variable_name = 'Ssl_cipher'
AND ts.variable_value != ''
AND t.processlist_user IS NOT NULL;⚠️ 注意:需确保
performance_schema已启用,且threads_status表中保留了 SSL 相关状态(MySQL 8.0.22+ 默认开启;5.7 需手动启用performance_schema=ON并确认setup_consumers中events_statements_current和threads已启用)。
✅ 2. 建立「cipher 名称 → 加密强度等级」映射表(供人工或脚本归类)
MySQL 不暴露强度数值,但你可以依据 IETF RFC 和 NIST 标准,将常见 cipher 映射为三档强度:
| 强度等级 | 典型 cipher 示例(SHOW STATUS LIKE 'Ssl_cipher' 返回值) |
说明 |
|---|---|---|
| Strong (256-bit) |
TLS_AES_256_GCM_SHA384, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-RSA-AES256-GCM-SHA384
|
使用 AES-256 或 ChaCha20-Poly1305,前向安全,推荐生产首选 |
| Acceptable (128-bit) |
TLS_AES_128_GCM_SHA256, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES128-GCM-SHA256
|
安全可用,但低于 256-bit 的抗量子裕度 |
| Weak / Deprecated |
AES128-SHA, AES256-SHA, DHE-RSA-AES256-SHA, RC4-SHA, DES-CBC3-SHA
|
缺乏前向安全、含已弃用算法(如 SHA-1、RC4、3DES),应禁用 |
? 提示:可通过 openssl ciphers -V 'ALL:COMPLEMENTOFDEFAULT' | grep -E '^(0x[0-9A-F]{4})\s+[0-9]+\s+' 查看 OpenSSL 实际支持 cipher 的密钥长度与协议版本,再与 MySQL 实际协商结果比对。
✅ 3. 汇总分布 + 定位弱连接源头
将上一步查询结果导出后(或用临时表聚合),运行统计:
-- 示例:按强度等级统计连接数
WITH cipher_strength AS (
SELECT
id, user, host,
CASE
WHEN ssl_cipher IN ('TLS_AES_256_GCM_SHA384','ECDHE-RSA-AES256-GCM-SHA384') THEN 'Strong'
WHEN ssl_cipher IN ('TLS_AES_128_GCM_SHA256','ECDHE-RSA-AES128-GCM-SHA256') THEN 'Acceptable'
ELSE 'Weak'
END AS strength_level
FROM your_exported_or_temp_table
)
SELECT
strength_level,
COUNT(*) AS conn_count,
GROUP_CONCAT(DISTINCT CONCAT(user,'@',host) SEPARATOR '; ') AS affected_users
FROM cipher_strength
GROUP BY strength_level;? 同时可快速定位问题连接:
-
user='legacy_app'@'10.0.5.%'大量使用AES128-SHA→ 推动该应用升级 TLS 客户端库; -
user='monitor'@'%'使用空 cipher 或未加密 → 检查监控工具是否遗漏--ssl-mode=REQUIRED参数。
SSL 加密强度审计不依赖神秘变量,靠的是把 Ssl_cipher 字符串解析清楚、对照标准分级、再关联连接上下文。只要数据库启用了 performance_schema 且客户端真实走 SSL,这套方法就能准确反映真实加密水位。


















