如何在MySQL中配置基于SSL证书的用户身份验证

酷芳大大_4604

酷芳大大_4604

2026-09-06

640人浏览

原创

mysql ssl用户认证需同时满足四要素:服务端强制require_secure_transport=on、证书链完整、用户语句精准指定subject/issuer、客户端显式提交三证书并启用--ssl-mode=required,缺一则报access denied。

如何在mysql中配置基于ssl证书的用户身份验证

MySQL 基于 SSL 证书的用户身份验证不是“配完证书就能用”,必须同时满足服务端强制、证书链完整、用户语句精准、客户端显式提交四要素,缺一即报 Access denied for user (using password: NO) 这个极具误导性的错误。

服务端必须开启 require_secure_transport=ON 并加载完整证书链

这是双向认证的硬性前提,不是可选项。仅配置 ssl_ca/ssl_cert/ssl_key 只能启用单向 SSL(只验服务端),无法触发客户端证书校验。

  • require_secure_transport=ON 强制所有连接走加密通道,否则直接拒绝;不设它,客户端即使带证书也会被降级到非 SSL 连接
  • 服务端证书(server-cert.pem)必须含 subjectAltName(如 DNS.1 = localhost 或 IP.1 = 192.168.1.10),否则客户端连接时会报 SSL connection error: Certificate verification failed
  • CA 文件(ca.pem)必须是 PEM 格式且顺序正确:根 CA 在前,中间 CA(如有)紧随其后;MySQL 不支持多文件拼接,也不能用 DER 格式
  • 所有证书文件(ca.pem、server-cert.pem、server-key.pem)属主必须是 mysql 用户,权限 ≤600,否则 mysqld 启动时静默失败,日志只显示 Failed to set up SSL

创建用户时不能只写 REQUIRE X509,必须锁定 SUBJECT 或 ISSUER

REQUIRE X509 仅检查证书格式和签名有效性,不校验是谁签发、谁持有——私钥一旦泄露,攻击者可用同 CA 下任意合法证书登录。

SSL
SSL

配置HTTPS,管理TLS证书,并调试安全连接问题。

下载
  • 推荐写法:CREATE USER 'api'@'%' REQUIRE SUBJECT '/CN=api-client/OU=Service/O=MyOrg/C=CN';注意斜杠与等号间**不能有空格**,大小写和字段顺序必须与 openssl x509 -in client-cert.pem -subject -noout 输出完全一致
  • 若需更严格控制,叠加 AND ISSUER '/CN=MyMySQLCA',确保只接受指定 CA 签发的证书
  • 执行后务必运行 FLUSH PRIVILEGES,否则新策略不生效
  • 切勿对 root 用户配置 REQUIRE X509,容易因证书问题彻底锁死管理入口

客户端连接必须显式传入三证书 + --ssl-mode=REQUIRED

MySQL 默认不启用 SSL,即使服务端强制,客户端不主动声明,连接仍会 fallback 到非加密通道,导致认证流程跳过证书校验阶段。

  • 命令行示例:mysql --ssl-mode=REQUIRED --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -u api
  • Python PyMySQL 需传入字典:ssl={'ca': 'ca.pem', 'cert': 'client-cert.pem', 'key': 'client-key.pem'},缺任一字段都会失败
  • --ssl-mode=VERIFY_IDENTITY 更安全,但要求服务端证书的 SAN 匹配连接地址(如用 IP 连接却只写了 DNS 名),内网调试时容易误踩,建议先用 REQUIRED
  • Java JDBC 连接字符串中,useSSL=true 已废弃,必须用 sslMode=REQUIRED,并配合 trustCertificateKeyStoreUrl 指向 JKS 密钥库(需用 keytool 将 ca.pem 导入)

验证证书链是否完整是排查失败的第一步

绝大多数 “Access denied” 实际源于 OpenSSL 层校验失败,而非 MySQL 权限逻辑问题。服务端日志往往不报明错,必须手动验证。

  • 在客户端机器上运行:openssl verify -CAfile ca.pem client-cert.pem;返回 OK 才算通过基础链路验证
  • 若失败,常见原因是:CA 文件缺失中间证书、client-cert.pem 里混入了私钥、或 ca.pem 权限不对(OpenSSL 要求只读)
  • 服务端启动后,可查状态:SHOW VARIABLES LIKE '%ssl%'; 确认 have_ssl 为 YES,且 ssl_ca 路径正确;再执行 STATUS 查看当前连接是否启用了 SSL
  • 不要依赖客户端错误提示判断问题——using password: NO 是伪装,真实原因永远藏在服务端错误日志或 OpenSSL 验证结果里

真正卡住人的地方,从来不是生成证书那几步命令,而是证书链顺序、SUBJECT 字符串空格、文件权限、以及客户端是否真的把三个 PEM 文件都送到了 OpenSSL 握手环节——这些细节不逐项验证,光改 SQL 或配置文件毫无意义。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2073

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1279

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2792

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4628

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1079

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4911

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4382

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5714

11

热门下载

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

精品课程

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

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习