无法使用ssl连接PDO,但使用ssl连接到mysqli
我们通过创建证书,更新my.cnf,创建具有正确权限的用户并需要ssl,重新启动服务并验证它是否有效服务器端和客户端(通过mysql命令行)通过远程连接。我也验证了PDO能够在完全相同的设置下正常工作,但在mysql中禁用用户帐户中的“require ssl”,因为它只是静默地失败并使用非ssl连接。无法使用ssl连接PDO,但使用ssl连接到mysqli
但是,使用PHP应用程序进行连接时,使用PDO强制ssl无法正常工作,但使用强制ssl使用mysqli可以正常工作。我认为他们使用相同的驱动程序,两者都应该正常工作。我得到的错误消息是'失败连接到数据库[SQLSTATE [2800] [1045]拒绝访问用户',但用户存在,并且此连接与mysqli(force ssl)一起使用,只有当我删除'在mysql中需要用户的ssl'。
PHP 5.5.9 CentOS版本6.5(最终) PDO_MYSQL 31年5月5日
让我知道如果我可以提供任何其他信息。下面是连接示例,
//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的支持可能有问题?
谢谢。
下面的代码将解决问题,
新PDO( 'MySQL的:主机='。HOST '; DBNAME =' DBNAME ';字符集= UTF8',用户名,密码, 阵列( PDO :: MYSQL_ATTR_SSL_KEY =>'/ mysqlsslcertificate1/client-key.pem', PDO :: MYSQL_ATTR_SSL_CERT =>'/ mysqlsslcertificate1/client-cert.pem', PDO :: MYSQL_ATTR_SSL_CA =>'/ mysqlsslcertificate1/ca-cert.pem ' ) );
这与上面提供的编码示例有何不同?看起来相同...请澄清。 – user3581488
@ user3581488我们需要ssl pem文件的路径,而不仅仅是文件的名称 – Elby
我们的两个编码示例都需要完整路径,所以mysqli和pdo无法解决此问题。所以这在原来的post/code例子中没有改变。 – user3581488
实际的问题是服务器证书CN验证(不匹配),但报告的错误是PDOException: SQLSTATE[HY000] [2002]
有许多虫子在PHP中记录了这一问题,如:7184571003和Github PR
的解决方案是这样无证这些PHP版本 22年6月5日(不知道)后属性可用,7.0.18(验证)和7.1.15(不知道)
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
可能的值:true和false 默认值:真
使你的代码看起来应该像
$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
)
);
检查这个,它可能会帮助http://*.com/questions/9738712/connect-to-remote-mysql-server-with-ssl-from-php –
已经引用这个帖子,这些例子说明我是如何已经连接起来,没有概念证明,只是从文档中提取可能。我想在它下面没有正确连接通过ssl所有这就是为什么我被阻止,也许我会看看源代码,并尝试像Xdebug如果可能的话。 – user3581488
我知道这是旧的,但..我坚持与完全相同的问题!命令行+ mysqli工作得很好,但PDO返回“访问被拒绝”。请告诉我,你找到了一个解决方案,你记得它...... – Delphine