You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP升级至8.2后Cloud SQL PDO连接失败,报MY-010914错误

解决PHP 8.2升级后PDO连接Cloud SQL出现Bad handshake错误

问题描述

升级PHP至8.2版本后,使用PDO连接Cloud SQL(仅允许客户端证书+SSL加密连接)时,突然抛出错误:

[MY-010914] [Server] Bad handshake
连接代码未做修改,重新生成SQL证书后问题仍未解决,相关代码如下:

$this->connection = new PDO("mysql:host=$servername;dbname=$database",
    self::USERNAME,
    self::PASSWORD, 
    [
        PDO::MYSQL_ATTR_SSL_KEY                => $ck,
        PDO::MYSQL_ATTR_SSL_CERT               => $cc,
        PDO::MYSQL_ATTR_SSL_CA                 => $sc,                    
        PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

可能的解决方法

  • 显式指定兼容的SSL加密套件
    PHP 8.2调整了MySQL SSL连接的默认加密套件,而Cloud SQL对加密套件有特定要求。在PDO选项中添加指定兼容的cipher:
$this->connection = new PDO("mysql:host=$servername;dbname=$database",
    self::USERNAME,
    self::PASSWORD, 
    [
        PDO::MYSQL_ATTR_SSL_KEY                => $ck,
        PDO::MYSQL_ATTR_SSL_CERT               => $cc,
        PDO::MYSQL_ATTR_SSL_CA                 => $sc,                    
        PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
        PDO::MYSQL_ATTR_SSL_CIPHER             => 'ECDHE-RSA-AES256-GCM-SHA384', // 或Cloud SQL推荐的其他套件
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

可根据Cloud SQL实例的数据库版本调整cipher,比如DHE-RSA-AES256-SHA也是常见兼容选项。

  • 验证证书文件的权限与路径
    PHP 8.2对文件权限的检查更严格,确保SSL证书文件(私钥、客户端证书、CA证书)的路径正确,且PHP进程拥有读取权限(建议设置为644)。可以在连接前先验证:
// 检查证书文件是否存在且可读
$certFiles = [$ck, $cc, $sc];
foreach ($certFiles as $file) {
    if (!file_exists($file) || !is_readable($file)) {
        throw new Exception("无法访问SSL文件: $file");
    }
}
  • 强制使用TLS 1.2或更高版本
    Cloud SQL可能不再支持旧版TLS协议,显式指定TLS版本确保兼容性:
$this->connection = new PDO("mysql:host=$servername;dbname=$database",
    self::USERNAME,
    self::PASSWORD, 
    [
        PDO::MYSQL_ATTR_SSL_KEY                => $ck,
        PDO::MYSQL_ATTR_SSL_CERT               => $cc,
        PDO::MYSQL_ATTR_SSL_CA                 => $sc,                    
        PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
        PDO::MYSQL_ATTR_SSL_OPTIONS            => [
            'ssl_mode' => 'REQUIRED',
            'tls_version' => 'TLSv1.2'
        ],
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

注意此选项依赖MySQLnd驱动,确认PHP 8.2已安装该驱动。

  • 检查Cloud SQL实例配置

    • 确认实例的SSL功能处于启用状态,客户端证书已正确绑定到该实例;
    • 检查数据库版本是否与PHP 8.2兼容(建议使用MySQL 5.7及以上版本);
    • 验证网络连接:如果使用私有IP,确保服务器与Cloud SQL实例的网络互通,无防火墙拦截3306端口。
  • 完善PDO连接字符串
    在连接字符串中显式指定端口(默认3306),避免端口解析问题:

"mysql:host=$servername;port=3306;dbname=$database"

内容的提问来源于stack exchange,提问作者K Kataria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:20:03