MySQL 8.0如何开启强制SSL连接授权_使用REQUIRE SSL关键字

夏丽酱_1798

夏丽酱_1798

2026-05-22

866人浏览

原创

REQUIRE SSL 不生效主因是服务端未启用 SSL,需先执行 SHOW VARIABLES LIKE 'have_ssl' 确认返回 YES,再检查 ssl_ca、ssl_cert、ssl_key 为非空绝对路径且权限正确,否则所有客户端配置无效。

mysql 8.0如何开启强制ssl连接授权_使用require ssl关键字

REQUIRE SSL 不生效,90% 是服务端压根没启用 SSL,而不是用户语法写错了。 它不会报错,也不会拒绝连接——它只是安静地退化成明文连接。必须从服务端证书加载状态开始排查,否则所有客户端配置都是徒劳。

检查 MySQL 实例是否真正启用了 SSL

这是第一步,也是最容易被跳过的致命环节。执行 SHOW VARIABLES LIKE 'have_ssl';,返回值必须是 YES;若为 DISABLED 或 NO,说明 OpenSSL 库未加载或配置缺失,后续所有操作都无效。

  • ssl_ca、ssl_cert、ssl_key 三个变量必须是非空的**绝对路径**,且 MySQL 进程(通常是 mysql 用户)有读权限;相对路径、符号链接、放错目录(如丢进 /etc/mysql/conf.d/ 却没 include)都会导致加载失败
  • Docker 或云数据库(如 RDS)默认可能只开启 TLS 1.2+ 协商能力,但未启用完整 SSL 握手支持,REQUIRE SSL 会静默失效
  • Linux 下 SELinux 或 AppArmor 可能拦截访问,临时执行 setenforce 0 测试可快速验证是否为此类权限问题

创建或修改用户时 REQUIRE SSL 的实际效果

REQUIRE SSL 只约束 TCP 连接,对 localhost(Unix socket)完全无效——它直接绕过所有网络层校验。测试务必用 127.0.0.1 或远程 IP,否则永远看不到加密效果。

  • 新建用户:使用 CREATE USER 'app'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;
  • 修改已有用户(MySQL ≥ 8.0.22):用 ALTER USER 'app'@'%' REQUIRE SSL;,但必须跟 FLUSH PRIVILEGES; 才能让新策略对后续连接生效;已有活跃连接不受影响
  • 注意认证插件兼容性:caching_sha2_password 是 MySQL 8.0 默认插件,与 SSL 正交,但旧版 PHP mysqli、某些 JDBC 驱动不支持该插件 + SSL 组合,会报 Authentication plugin 'caching_sha2_password' cannot be loaded;可显式指定插件:CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd' REQUIRE SSL;

客户端必须主动发起 SSL 握手,不能依赖服务端强制

哪怕服务端设了 REQUIRE SSL,JDBC、pymysql、mysql CLI 等客户端默认仍走明文——它们根本不会发 Client Hello。结果不是“证书错误”,而是直接 Access denied。

SSL Certificate Monitor
SSL Certificate Monitor

检查一个或多个域名的 SSL/TLS 证书到期时间、颁发者、协议及 SAN 信息,用于应要求检查证书、监控到期或验证 HTTPS 等场景。

下载
  • 命令行连接:必须加 --ssl-mode=REQUIRED,仅 --ssl 或 --ssl-mode=PREFERRED 会自动降级,无法验证是否真加密
  • JDBC URL 示例:jdbc:mysql://host:3306/db?sslMode=REQUIRED&enabledTLSProtocols=TLSv1.2;useSSL=true 已废弃,不生效
  • Java 客户端若用自签名证书,避免 verifyServerCertificate=true(等价于 --ssl-mode=VERIFY_IDENTITY),因为自签证书 CN 通常为 localhost,与连接地址不匹配,直接拒绝
  • 验证是否真加密:登录后执行 STATUS;,看输出中是否有 SSL: Cipher in use is;或查 SELECT VARIABLE_VALUE FROM performance_schema.status_by_thread WHERE VARIABLE_NAME = 'Ssl_cipher' AND THREAD_ID = CONNECTION_ID();,非空即表示当前连接已加密

require_secure_transport=ON 是全局强制开关,但不是万能解

它只阻止非 SSL 的 TCP 连接,但不影响 Unix socket、本地文件导入、复制通道等其他入口。要真正堵死明文通路,需组合策略:

  • 必须设 require_secure_transport = ON(在 my.cnf 的 [mysqld] 段),并重启 mysqld;仅 reload 不生效
  • 所有用户都应带 REQUIRE SSL,否则该参数对这些用户无效
  • 应用连接禁用 localhost,统一改用 127.0.0.1 强制走 TCP
  • 服务端 tls_version 需与客户端匹配;MySQL 8.0.28+ 默认为 TLSv1.2,TLSv1.3,老客户端报 protocol version mismatch 时,可临时调宽:SET GLOBAL tls_version = 'TLSv1,TLSv1.1,TLSv1.2';(不推荐长期用于生产)

最常被忽略的是:证书私钥必须无密码、PEM 格式、与证书匹配,且 ssl_cipher 变量非空才代表握手链跑通。抓包验证(tcpdump -i lo port 3306 + Wireshark)仍是最终裁决手段——如果能看到明文 SELECT,那就肯定没加密。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql ssl require函数

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4583

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1189

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6541

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3303

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6500

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8941

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1210

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 192人学习