2014-04-28 193 views
2

我们通过创建证书,更新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的支持可能有问题?

谢谢。

+0

检查这个,它可能会帮助http://stackoverflow.com/questions/9738712/connect-to-remote-mysql-server-with-ssl-from-php –

+0

已经引用这个帖子,这些例子说明我是如何已经连接起来,没有概念证明,只是从文档中提取可能。我想在它下面没有正确连接通过ssl所有这就是为什么我被阻止,也许我会看看源代码,并尝试像Xdebug如果可能的话。 – user3581488

+0

我知道这是旧的,但..我坚持与完全相同的问题!命令行+ mysqli工作得很好,但PDO返回“访问被拒绝”。请告诉我,你找到了一个解决方案,你记得它...... – Delphine

回答

0

下面的代码将解决问题,
新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 ' ) );

+0

这与上面提供的编码示例有何不同?看起来相同...请澄清。 – user3581488

+0

@ user3581488我们需要ssl pem文件的路径,而不仅仅是文件的名称 – Elby

+0

我们的两个编码示例都需要完整路径,所以mysqli和pdo无法解决此问题。所以这在原来的post/code例子中没有改变。 – user3581488

0

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

有许多虫子在PHP中记录了这一问题,如:7184571003Github 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 
) 

);