gpt4 book ai didi

php - 无法使用 ssl 与 PDO 连接,但 mysqli 与 ssl 可以工作

转载 作者:行者123 更新时间:2023-11-29 03:01:13 25 4
gpt4 key购买 nike

我们通过创建证书、更新 my.cnf、创建具有正确权限的用户并需要 ssl、重新启动服务来使用 SSL 设置 mysql,并通过连接验证它在服务器端和客户端(通过 mysql 命令行)工作远程。我还验证了 PDO 在完全相同的设置下正常工作,但禁用了 mysql 中用户帐户的“require ssl”,因为它只是默默地失败并使用非 ssl 连接。

但是,当使用 PHP 应用程序进行连接时,它无法使用 PDO 强制 ssl,但可以使用带有强制 ssl 的 mysqli。我认为他们使用相同的驱动程序,两者都应该可以正常工作。我收到的错误消息是“无法连接到数据库 [SQLSTATE[28000] [1045] 拒绝用户访问”,但用户存在并且此连接适用于 mysqli(强制 ssl)并且仅当我删除时连接才适用于 PDO '在 mysql 中需要来自用户的 ssl。

PHP 5.5.9CentOS 6.5 版(最终版)pdo_mysql 5.5.31

如果我可以提供任何其他信息,请告诉我。以下是连接示例,

//mysqli
$conn=mysqli_init();
mysqli_ssl_set($conn, $clientkey, $clientcert, $sharedca, NULL, NULL);
if (!mysqli_real_connect($conn, $host, $user, $pass, $db))
{
die("Failed connecting to ssl mysql via mysqli");
}

$res = mysqli_query($conn, "SHOW STATUS like 'Ssl_cipher'");
print_r(mysqli_fetch_row($res));
mysqli_close($conn);

//pdo
$options = array_merge($options, array(
PDO::MYSQL_ATTR_SSL_KEY => $sslkey,
PDO::MYSQL_ATTR_SSL_CERT => $sslcert,
PDO::MYSQL_ATTR_SSL_CA => $sslca,
));

try
{
$pdo = new PDO("mysql:dbname={$db};host={$host}", $user, $pass, $options);
}
catch( PDOException $e )
{
die("Failed connecting");
}

关于如何将 SSL 与 PDO 正确连接,有什么我应该知道的吗?还是我被迫切换到 mysqli,因为 PDO 对 SSL 的支持可能有问题?

最佳答案

实际问题是服务器证书 CN 验证(不匹配),但报告的错误是 PDOException: SQLSTATE[HY000] [2002]

在 PHP 中记录了许多针对该问题的错误,例如:71845 71003Github PR

解决方案是在这些 PHP 版本之后提供这个未记录的属性5.6.22(不确定)、7.0.18(已验证)和 7.1.15(不确定)

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

可能的值:true, false默认值:true

所以你的代码应该是这样的

$pdo = new PDO('mysql:host=XXXXXX;dbname=XXXXXX', 'XXXXXX', 'XXXXXX', array(
PDO::MYSQL_ATTR_SSL_KEY =>'/path/to/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT =>'/path/to/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA =>'/path/to/server-ca.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
)

);

关于php - 无法使用 ssl 与 PDO 连接,但 mysqli 与 ssl 可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23342604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com