首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用ssl与PDO连接,但使用ssl的mysqli可以工作

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

Stack Overflow用户
提问于 2014-04-28 21:35:06
回答 2查看 5.4K关注 0票数 2

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

但是,当使用PHP应用程序进行连接时,它不能使用PDO强制ssl,但可以使用mysqli和强制ssl进行连接。我认为他们使用相同的驱动程序,两者都应该工作得很好。我得到的错误信息是‘连接到数据库失败[用户的SQLSTATE28000访问被拒绝’,但用户存在,此连接使用mysqli (force ssl)工作,只有当我在mysql中删除用户的'require ssl‘时,此连接才适用于PDO。

pdo_mysql 5.5.9 CentOS release 6.5 (最终版) php 5.5.31

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

代码语言:javascript
复制
//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的支持可能有问题?

EN

回答 2

Stack Overflow用户

发布于 2018-01-29 16:27:00

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

在PHP中记录了大量的错误,比如:71845、71003和Github PR

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

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

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

因此,您的代码应该如下所示

代码语言:javascript
复制
$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
)

);

票数 2
EN

Stack Overflow用户

发布于 2016-01-25 13:58:34

下面的代码将解决您的问题

代码语言:javascript
复制
new PDO('mysql:host='.HOST.';dbname='.DBNAME.';charset=utf8', USER, PASSWORD,
    array(
            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'
    )
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23342604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档