mysqli_real_connect() 获取 SSL3_GET_SERVER_CERTIFICATE:证书验证失败
Posted
技术标签:
【中文标题】mysqli_real_connect() 获取 SSL3_GET_SERVER_CERTIFICATE:证书验证失败【英文标题】:mysqli_real_connect() getting SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 【发布时间】:2015-04-30 21:27:09 【问题描述】:我们刚刚从 php 5.4 升级到 php 5.6,一切正常,我们的 mysql 使用 MySQLi 和 SSL 连接。
我们的连接如下所示:
mysqli_real_connect($db, $host, $username, $password, $database, $port, $socket, MYSQLI_CLIENT_SSL);
mysqli_set_charset($db, "utf8");
但是,现在当我们尝试使用 php 5.6 通过 SSL 连接到 MySQL 时,我们得到:
警告:mysqli_real_connect():SSL 操作失败,代码为 1。 OpenSSL 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败 /MySQLConnection.php 第 29 行
警告:mysqli_real_connect():无法使用 SSL 连接到 MySQL 在 /MySQLConnection.php 第 29 行
警告:mysqli_real_connect(): [2002](试图通过 tcp://mysql1.ourdomain.com:3306) 在 /MySQLConnection.php 第 29 行
警告:mysqli_real_connect(): (HY000/2002): in /MySQLConnection.php 第 29 行
我试过设置:
mysqli_options($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);
但这无济于事。
更新
我补充说:
$mysql_certs_path = "/full/path/to/certs/mysql";
mysqli_ssl_set($db, $mysql_certs_path . "/client-key.pem", $mysql_certs_path . "/client-cert.pem", $mysql_certs_path . "/ca-cert.pem", null, null);
并且仍然得到:
警告:mysqli_real_connect():SSL 操作失败,代码为 1。 OpenSSL 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败 /MySQLConnection.php 第 31 行
Warning: mysqli_real_connect(): Cannot connect to MySQL by using SSL in /MySQLConnection.php on line 31
【问题讨论】:
修复服务器证书? 请张贴服务器的证书。使用openssl x509 -in <file> -inform <PEM|DER> -text -noout
。此外,您需要提供您连接的确切方式(主机名、IP 地址等)。
请发布您用于连接服务器的确切 URL,并发布 openssl s_client -connect <hostname>:<port> -tls1 -servername <hostname> | openssl x509 -text -noout
的输出。通过单击编辑将其添加到您的问题中(不要将其作为评论发布)。否则,没有足够的信息来帮助解决问题。
【参考方案1】:
@jww,我写了一篇文章,分享了@Justin 在这里面临的问题。根据my post,Google Cloud SQL 颁发的证书的CN 格式为:
CN=project-name:instance-id
【讨论】:
【参考方案2】:有类似的事情发生在我身上。当我将 PHP 升级到 5.6 时,它起作用了。但是当我进入时:
sudo apt-get install php5-mysqlnd
在 Ubuntu 15.04 上,AWS RDS 的 SSL 停止工作,即使它与 libmysql 驱动程序一起工作。运行:
sudo apt-get install php5-mysql
安装了旧的驱动程序,它又开始工作了。据我所知,连接到 RDS 的对等名称验证失败。我不知道如何解决这个问题,而且因为它使用 PHP 流进行连接,所以你传入的设置似乎并不重要。
这是一个已知的错误:
https://bugs.php.net/bug.php?id=68344
所以我写了这个方法,从这里修改:How to know if MySQLnd is the active driver?
public function getMySQLIType()
$mysqlType = [
'mysql' => false,
'mysqli' => false,
'mysqlnd' => false,
];
if (function_exists('mysql_connect'))
$mysqlType['mysql'] = true;
if (function_exists('mysqli_connect'))
$mysqlType['mysqli'] = true;
if (function_exists('mysqli_get_client_stats'))
$mysqlType['mysqlnd'] = true;
return $mysqlType;
如果数组为 mysqlnd 返回 true,我将禁用 SSL。如果返回 false,那么我启用它。到目前为止,它有效。是的,这是一个 hack 修复,但我不知道如何合法地修复此问题。
【讨论】:
以上是关于mysqli_real_connect() 获取 SSL3_GET_SERVER_CERTIFICATE:证书验证失败的主要内容,如果未能解决你的问题,请参考以下文章
mysqli_real_connect(): (HY000/1045): Access denied for user 'phpmyadmin'@'localhost' (使用密码: YES)
mysqli_real_connect(): (HY000/2006): MySQL 服务器已经消失
从今天起无法通过 XAMPP 连接到本地 MY SQL 数据库 (mysqli_real_connect(): (HY000/2002))
mysqli_real_connect():(HY000/1698):用户'root'@'localhost'的访问被拒绝-我的mac重新启动后出现此错误[重复]
警告:mysqli_real_connect(): (HY000/1698): Access denied for user 'wpuser'@'localhost' in /var/www/html
警告:mysqli_real_connect(): (HY000/2002): 第 1452 行的 /private/tmp/wordpress/wp-includes/wp-db.php 中没有这样