gpt4 book ai didi

php - PDO 与数据库的连接在证书验证时失败

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:12 25 4
gpt4 key购买 nike

我一直在 Ubuntu 18.04 LTS 上运行 mysql 数据库。一切正常,除非我按照这些教程尝试实现 SSL: https://www.digitalocean.com/community/tutorials/how-to-configure-ssl-tls-for-mysql-on-ubuntu-16-04 https://www.acunetix.com/blog/articles/securing-mysql-server-ubuntu-16-04-lts-configuring-mysql-securely-part-3/

连接失败。我尝试使用 PDO 和普通的 MYSQLI 连接来实现它,但它在证书验证方面一直失败。

我正在使用 mysqlnd 传输器运行 PHP 7.1.8。

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>SSL Connection test</title>
</head>
<body>
<?php
phpinfo();
$servername = "****";
$username = "****";
$password = "****";
$dbname = "****";

$options = array(
PDO::MYSQL_ATTR_SSL_KEY => 'client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => 'client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => 'ca.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
);

try {
$conn = new PDO("mysql:host=$servername;port=3306;dbname=$dbname;", $username, $password, $options);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
var_dump($conn->query("SHOW STATUS LIKE 'Ssl_cipher';")->fetchAll());
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}

?>
</body>
</html>

这是我目前用来测试功能的代码。每当我将 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 设置为 false 时,连接就会成功。如果 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 为真,则连接失败。

失败时的错误信息:

Connection failed: SQLSTATE[HY000][2002]

连接消息:

Connected successfullyarray(1) { [0]=> array(4) { ["Variable_name"]=> string(10) "Ssl_cipher" [0]=> string(10) "Ssl_cipher" ["Value"]=> string(18) "DHE-RSA-AES256-SHA" [1]=> string(18) "DHE-RSA-AES256-SHA" } }

已通过以下代码检查证书:

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

这对两个文件都返回 OK。

过去几个小时我一直在尝试解决这个问题,但我似乎无法找出问题所在。

请帮我解决这个问题。

编辑:所有文件(client-key.pemclient-cert.pemca.pem)都经过测试is_readable 并且可读。

最佳答案

您可能知道,在 Windows Server IIS PHP 配置中,您需要设置 openssl.cafile 指令,提供证书颁发机构 (CA) 文件的路径。这在使用系统默认值的 Linux 上不是必需的。 MYSQL_ATTR_SSL_CA 在 Windows 上需要此路径,在 Linux 上可能会被省略。

要将此逻辑添加到您的 PDO 测试脚本中,请使用您的操作系统信息添加一个额外的变量并更改 MYSQL_ATTR_SSL_CA 行:

$OS = ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' );
PDO::MYSQL_ATTR_SSL_CA => $OS ? 'c:/path/to/cacert.pem' : '',

您的 $options 数组变为:

$OS = ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' );

$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::MYSQL_ATTR_SSL_CA => $OS ? 'c:/path/to/cacert.pem' : '',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
);

f $OS === true(例如 $OS === 'WIN') 使用 c:/path/to/cacert.pem 作为 PDO::MYSQL_ATTR_SSL_CA 文件路径,否则我们在 Linux 上并省略路径。这样您就可以确保可以在 Windows Server 和 Linux 上跨平台使用此 PHP 代码!

与 WordPress 的安全 MySQL 连接

在 WordPress 中,您可以使用安全数据库连接插件来设置和配置与 MySQL 数据库的 SSL 连接。不要忘记在您的数据库权限中设置 REQUIRE SSL。

关于php - PDO 与数据库的连接在证书验证时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55970388/

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