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

2024-01-22

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

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

php 5.5.9 CentOS 版本 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 https://bugs.php.net/bug.php?id=71845 71003 https://bugs.php.net/bug.php?id=71003 and GitHub公关 https://github.com/php/php-src/pull/1913

解决方案是在这些 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
)

);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 ssl 与 PDO 连接,但使用 ssl 的 mysqli 可以工作 的相关文章

随机推荐

  • 设置鼠标位置

    我需要能够将鼠标位置设置到屏幕 窗口的中间 我怎样才能做到这一点 该文档似乎表明CGDisplay移动光标到点 http developer apple com library mac documentation GraphicsImagi
  • Git 远程恢复

    我是 Git 新手 正在使用 WebStorm 来推送和拉取我的代码 我们正在开展一个共同的项目 昨晚我的朋友更新了一些代码并推送了更改 今天 我拉取了代码并合并了更改 但我错误地保留了更改并放弃了拉取请求提供的更改 然后将这些更改推送到
  • 如何获取 Laravel CSRF-token 以通过 React 中的 fetch post 请求发送它?

    我正在使用开发网络应用程序创建反应应用程序和拉维尔 创建反应应用程序在 localhost 3000 上运行开发项目 而 laravel 后端在 localhost 8080 上运行 这是我的代码的一部分 const onSubmit e
  • 修复了 Highcharts 中的 y 轴标签宽度

    我正在构建一个数据演示 其中两个 Highcharts 图表垂直堆叠 旨在共享相同的 x 轴单位和对齐方式 就像这样 请注意 由于两个图表的 y 轴范围不同 因此 y 轴标签的宽度不同 因此图表本身的宽度略有不同 破坏了良好的 x 轴对齐
  • 如何让 System.Net.Http.HttpClient 不遵循 302 重定向?

    Using 来自 NuGet 的 HttpClient http nuget org packages HttpClient 应用程序使用 client PostAsync 发送帖子 我希望它不遵循 302 重定向 how 我想我可以设置A
  • 将元描述和开放图谱协议描述合并到一个标签中

    是否可以将元描述和开放图协议描述结合起来 当它们包含相同的内容时合而为一 是的 您可以将它们结合起来 为了测试它 我制作了下面的简单 HTML 页面 将其上传到服务器 然后通过 Facebook 运行该页面网址检查器 https
  • 更新 LayoutView 的模型

    JSBin 链接 http jsbin com rosadomisa edit html js console output 单击 Clicks 链接可查看显示更新后的模型数据的控制台 但原始显示的 HTML 不会更改 更新 LayoutV
  • 将 Windows 对话框错误消息重定向到控制台

    有谁知道如何重定向 捕获模式 Windows 错误对话框 对于仅尝试运行程序并捕获退出代码和 stdout stderr 输出的非交互式命令行程序来说 这确实是个问题 此问题的最新实例是一个模态 Windows 对话框 其形式如下 The
  • AWS S3 最大文件和上传大小

    AWS S3 文档说 单个 Amazon S3 对象的大小范围最小为 0 字节到最大 5 TB 最大的物体可以 一次 PUT 上传的大小为 5 GB 如果我只能上传 5GB 的文件 如何存储 5TB 的文件 根据文档here http do
  • Python 3.5 async for 阻止 ioloop

    我有一个带有两个处理程序的简单 aiohttp 服务器 第一个在中进行一些计算async for环形 第二个仅返回文本响应 not so long operation以最慢的递归实现返回第 30 个斐波那契数 大约需要一秒钟 def not
  • Akka.Net 发送巨大消息(最大帧大小)

    我有一个关于增加最大帧大小和发送 接收缓冲区大小值的问题 他们的高度有限制吗 我将大量数据传递到系统中 比如 20mb 然后用于计算一些结果并返回 将上述参数设置为 100mb 会导致消息被丢弃 在这种情况发生之前我可以通过的最大块大约是
  • 如何在 LDAP 中按 DN 进行搜索?

    我正在从 LDAP 中提取有关用户的信息 这包括 directReports 它是完整的CN cnBlah OU ouBlah DC dcBlah形式 我正在尝试再次查找有关该记者的信息 到目前为止 我能够真正找到所述用户的唯一方法是打破C
  • 关于“==”运算符行为的解释

    在下面的非常简单的示例中 我无法理解 运算符的行为 A lt c 10 20 10 10 20 30 B lt c 40 50 60 70 80 90 df lt data frame A B df df A c 10 20 it retu
  • mongodb ISODate 问题

    我正在使用java IDE是eclipse 在mongodb上查询 下面是我的java代码 DBObject query new BasicDBObject ObjectId id new ObjectId 529f280b90ee58cb
  • SpringBoot:配置生产环境与开发环境

    我在使用 SpringBoot 1 5 1 时遇到问题 我已经创建了application properties and application dev properties对于我的开发环境 主要区别在于持久性 在生产中 applicati
  • GruntJS - grunt 构建后错误的图像路径

    Grunt 弄乱了我的缩小 CSS 我不知道为什么以及如何避免它 简而言之 在缩小之前我有一些像这样的背景图像 head image height 380px background url images head1 bg png repea
  • MYSQL排序与主义

    如本文所述question https stackoverflow com questions 41126279 doctrine orm order by annotations object fields并回答 不可能 我提出了一个新问
  • 倒计时栏 Android 示例

    有什么帮助可以在进度条上显示这个简单的倒计时吗 new CountDownTimer 30000 1000 public void onTick long millisUntilFinished mTextField setText sec
  • 内部函数(python)的文档字符串是否必要? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在Python中 我们用以下划线开头来指定内部函数 私有方法 这些函数是否应该使用文档字符串进行记录 是否必需 我的意思是正式文档 而不是帮助代
  • 无法使用 ssl 与 PDO 连接,但使用 ssl 的 mysqli 可以工作

    我们通过创建证书 更新 my cnf 创建具有正确权限的用户并需要 ssl 重新启动服务来设置带有 SSL 的 mysql 并通过远程连接验证它在服务器端和客户端 通过 mysql 命令行 是否正常工作 我还验证了 PDO 在完全相同的设置