使用PHP PDO通过TLS连接MySQL 8时是否需要指定CA证书?
核心问题解答
- 首先可以明确:MySQL 和 Web 服务器的 TLS 握手逻辑完全一致,服务端会在 TLS 握手阶段主动向客户端发送自己的证书(包含公钥),这是 TLS 协议的标准流程,不属于配置错误。
1. 命令行连接无需指定 CA 证书的原因
你创建 ssluser 时应该指定了 REQUIRE SSL,要求该用户必须走 SSL 连接:
- 不加
--ssl=1时,你的本地 MySQL 客户端默认优先尝试非加密连接,被服务端直接拒绝,所以连接失败 - 加
--ssl=1后客户端强制发起 SSL 连接,满足服务端的账号要求。此时你没有主动开启服务端证书校验,客户端只会完成 TLS 加密握手,不会验证证书的合法性,自然不需要提供 CA 根证书做校验。
2. PDO 无证书文件可连接的原因
你当前的 PDO 配置存在参数误用,但刚好符合「不校验服务端证书」的逻辑,所以可以正常连接:
PDO::MYSQL_ATTR_SSL_CA正确的赋值应该是 CA 根证书的本地路径字符串,你赋值为true属于无效值- 但你同时配置了
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,关闭了服务端证书校验逻辑,所以上述无效的 CA 配置会被直接忽略,客户端和命令行场景一样,只完成加密握手不校验证书合法性,无需提供证书文件即可连接。
安全建议
你当前的 SSL 连接仅能保证传输过程加密,无法防御中间人攻击(攻击者可以伪造服务端证书欺骗客户端),如果是生产环境建议调整配置:
- 将服务端生成的自签 CA 根证书部署到客户端服务器本地
- 修改 PDO 配置为如下格式,开启证书合法性校验:
PDO::MYSQL_ATTR_SSL_CA => '/本地存放CA证书的绝对路径/ca.pem', PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
内容的提问来源于stack exchange,提问作者Halil Yıldırım
相关产品推荐
相关产品推荐

