MySQL~:/-、code•\clients-‘=•%‘=N/A?

张开发
2026/4/19 9:30:26 15 分钟阅读

分享文章

MySQL~:/-、code•\clients-‘=•%‘=N/A?
### 问题解构用户聚焦于 **iOS 上 MySQL 助手类 App如 SQLPro、MySQL Client启用 SSL 连接时MySQL 服务端必须配置的证书相关参数**。核心矛盾在于**App 端开启 SSL 仅是客户端行为若服务端未正确配置证书链、权限与强制策略则连接必然失败报错 SSL connection error 或 Access denied**。需明确区分三类参数- ✅ **服务端证书文件路径参数**物理存在且可读- ✅ **服务端 SSL 策略参数**强制校验等级- ❌ **客户端参数**如 --ssl-ca、--ssl-mode不属本题范围。依据参考资料MySQL 5.7 启用 SSL 的**充要条件**是同时满足- have_ssl YES编译支持 配置启用- ssl_mode ≥ REQUIRED服务端强制要求加密通道【ref_3】。---### 服务端必需配置的证书参数表| 参数名 | 配置位置 | 值示例 | 必需性 | 技术依据与校验逻辑 ||--------|----------|--------|--------|----------------------|| ssl_ca | [mysqld] 段 | /var/lib/mysql/ca.pem | ✅ 强制 | 指定根证书CA路径用于验证客户端/服务器证书签名若缺失SHOW VARIABLES LIKE have_ssl 返回 DISABLED【ref_3】 || ssl_cert | [mysqld] 段 | /var/lib/mysql/server-cert.pem | ✅ 强制 | 服务器公钥证书必须由 ssl_ca 对应 CA 签发CNCommon Name建议设为服务器域名或 IPiOS 校验较严【ref_2】 || ssl_key | [mysqld] 段 | /var/lib/mysql/server-key.pem | ✅ 强制 | 服务器私钥文件**权限必须为 600**否则 MySQL 启动失败mysql_ssl_rsa_setup 工具自动生成时已设好【ref_3】 || require_secure_transport | [mysqld] 段 | ON | ✅ 强制生产环境 | 全局强制所有连接使用 SSL/TLS若关闭即使客户端传 --ssl-modeREQUIRED服务端仍允许非加密连接【ref_1】 || ssl_crl | [mysqld] 段 | /var/lib/mysql/crl.pem | ⚠️ 可选高安全场景 | 证书吊销列表路径用于拒绝已被撤销的客户端证书iOS App 通常不提供客户端证书故此参数对普通连接无影响【ref_2】 | 关键结论**ssl_ca、ssl_cert、ssl_key、require_secure_transportON 是 iOS SSL 连接成功的最小参数集**缺一不可【ref_1】【ref_3】。---### 服务端完整 my.cnf 配置片段MySQL 8.0ini[mysqld]# SSL 证书路径绝对路径确保 mysql 用户有读取权限ssl_ca/var/lib/mysql/ca.pemssl_cert/var/lib/mysql/server-cert.pemssl_key/var/lib/mysql/server-key.pem# 强制所有连接使用 SSLiOS 公网连接必备require_secure_transportON# 【可选】限制仅接受特定加密套件提升兼容性# ssl_cipherECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384# 【重要】确保端口监听在外部可访问地址port3307bind-address0.0.0.0 # 允许 iPhone 局域网/IP 访问 ✅ 配置后必须重启服务sudo systemctl restart mysql ✅ 验证是否生效双查 sql SHOW VARIABLES LIKE have_ssl; -- 必须返回 YES SHOW VARIABLES LIKE ssl_mode; -- 必须返回 REQUIRED 或 VERIFY_CA SHOW VARIABLES LIKE require_secure_transport; -- 必须返回 ON ---### 证书生成与权限修复防踩坑实操#### 1. 使用官方工具生成推荐避免 OpenSSL 手动配置错误bash# 在 MySQL 数据目录下执行如 /var/lib/mysqlsudo mysql_ssl_rsa_setup --datadir/var/lib/mysql --uidmysql# 自动生成文件清单全部位于 /var/lib/mysql/# ca.pem ← 根证书iOS App 需导入此文件# server-cert.pem ← 服务器证书服务端 ssl_cert# server-key.pem ← 服务器私钥服务端 ssl_key权限自动设为 600# client-cert.pem ← 客户端证书iOS App 不需要但可作备用# client-key.pem ← 客户端私钥同上#### 2. 手动修复私钥权限若手动拷贝证书bashsudo chown mysql:mysql /var/lib/mysql/server-key.pemsudo chmod 600 /var/lib/mysql/server-key.pem # 关键MySQL 拒绝读取权限 600 的私钥【ref_3】#### 3. iOS App 端证书导入说明补充上下文- iOS MySQL 助手 App如 SQLPro连接时需上传 ca.pem 文件作为信任根- 若服务端 ssl_modeVERIFY_IDENTITY则 server-cert.pem 的 CN 必须与 App 中填写的 Host 完全一致如填 mysql.example.com则 CN 必须为该域名【ref_1】。---### SSL 连接失败诊断速查表| 错误现象 | 服务端日志线索 | 根本原因 | 修复命令 ||----------|----------------|----------|-----------|| SSL connection error: protocol version mismatch | mysqld.log 中无 SSL 相关加载记录 | ssl_ca 路径错误或文件不存在 | sudo ls -l /var/lib/mysql/ca.pem → 确认路径 权限 || Access denied for user ... (using password: YES) | mysqld.log 显示 Aborted connection ... because of SSL requirement | require_secure_transportOFF 或用户未启用 SSL 登录 | SET PERSIST require_secure_transportON; 重启 || SSL error: SSL_CTX_set_default_verify_paths failed | mysqld.log 报 SSL error on accept | ssl_ca 文件损坏或非 PEM 格式 | openssl x509 -in /var/lib/mysql/ca.pem -text -noout 验证格式 || iOS App 提示 Certificate verification failed | 无服务端日志 | iOS 未导入 ca.pem 或 CN 不匹配 | 在 App 连接设置中点击 “CA Certificate” → 选择 ca.pem 文件【ref_1】 |---### 最终验证从 iOS 设备反向测试 SSL 链路使用 openssl s_client 模拟 iOS TLS 握手在 Mac/Linux 执行等效于 iPhone 底层行为bash# 测试服务端证书是否可被 iOS 信任需提前将 ca.pem 复制到本地openssl s_client -connect 192.168.1.100:3307 \-CAfile ./ca.pem \-servername mysql.example.com # 若 server-cert.pem CN 为此域名# 成功标志输出中包含# Verify return code: 0 (ok)# Server certificate# subjectC CN, ST Beijing, L Beijing, O MyOrg, CN mysql.example.com✅ 此命令成功 iOS App 100% 可建立 SSL 连接失败则需按上述诊断表逐项修复【ref_2】【ref_3】。

更多文章