<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
$mysqli->ssl_set('/path/to/client-key.pem',
'/path/to/client-cert.pem',
'/path/to/ca-cert.pem',
NULL,NULL); //<-- Doesn't matter if the paths are right or wrong
if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!$mysqli->real_connect('xx.xx.xx.xx', 'my_user', 'my_password', 'my_db')) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>我无法连接到MySql。它给出了以下错误:
Message: SQLSTATE[28000] [1045] Access denied for user 'my_user'@'xx.xx.xx.xx' (using password: YES) <-- the client IP我已经把问题缩小到了$mysqli->ssl_set(...)**.**行
当我传递到证书的错误路径时,它应该根据SSL certificate error 抛出一个 这个职位 ,其中用户遇到了相同的问题,相反,它抛出了先前相同的访问拒绝错误。
通过配置ssl连接,我设法在数据库管理的帮助下使用Navicat与服务器建立了连接,如下所示:

备注:
PDO,它也遇到了同样的问题。mysql->connect(),但是它抛出了一个糟糕的握手错误,根据手册中的一些评论,它不起作用。phpinfo()启用了打开ssl。
所以问题是为什么PHP没有抱怨证书的错误路径?PHP似乎忽略了我设置证书路径的行!
更新:我尝试更改连接的行,以显式设置端口并使用MYSQLI_CLIENT_SSL
$mysqli->real_connect('xx.xx.xx.xx', 'my_user', 'my_password', 'my_db','3306',NULL,MYSQLI_CLIENT_SSL)但是,我得到了以下错误:
Warning: mysqli::real_connect(): (08S01/1043): Bad handshake in ...更新2:
这是数据库服务器tcpdump-ing的结果:
0x0040: 3142 6164 2068 616e 6473 6861 6b65 1Bad.handshake
13:16:18.133282 IP (tos 0x8, ttl 64, id 40823, offset 0, flags [DF], proto: TCP (6), length: 52) xx.xx.xx.202.mysql > xx.xx.xx.130.42766: F, cksum 0xf15f (correct), 112:112(0) ack 79 win 46 <nop,nop,timestamp 19516376 3465907>
0x0000: 4508 0034 9f77 4000 4006 c8a7 c0a8 28ca E..4.w@.@.....(.
0x0010: c0a8 2882 0cea a70e b36c 7e8b 7b4d a169 ..(......l~.{M.i
0x0020: 8011 002e f15f 0000 0101 080a 0129 cbd8 ....._.......)..
0x0030: 0034 e2b3 .4..
13:16:18.133433 IP (tos 0x8, ttl 64, id 17337, offset 0, flags [DF], proto: TCP (6), length: 52) xx.xx.xx.130.42766 > xx.xx.xx.202.mysql: F, cksum 0xb695 (correct), 79:79(0) ack 113 win 92 <nop,nop,timestamp 3480910 19516376>
0x0000: 4508 0034 43b9 4000 4006 2466 c0a8 2882 E..4C.@.@.$f..(.
0x0010: c0a8 28ca a70e 0cea 7b4d a169 b36c 7e8c ..(.....{M.i.l~.
0x0020: 8011 005c b695 0000 0101 080a 0035 1d4e ...\.........5.N
0x0030: 0129 cbd8 .)..
13:16:18.133452 IP (tos 0x8, ttl 64, id 40824, offset 0, flags [DF], proto: TCP (6), length: 52) xx.xx.xx.202.mysql > xx.xx.xx.130.42766: ., cksum 0xb6c3 (correct), 113:113(0) ack 80 win 46 <nop,nop,timestamp 19516376 3480910>
0x0000: 4508 0034 9f78 4000 4006 c8a6 c0a8 28ca E..4.x@.@.....(.
0x0010: c0a8 2882 0cea a70e b36c 7e8c 7b4d a16a ..(......l~.{M.j
0x0020: 8010 002e b6c3 0000 0101 080a 0129 cbd8 .............)..
0x0030: 0035 1d4e .5.NXx.202是数据库服务器ip。
Xx.130是我的个人电脑ip。
更新3:
我使用以下代码检查密码长度:
mysql> select length(Password) from mysql.user where User='youruser'密码长度为41。
更新4:
在远程服务器上使用命令行通过ssh连接时,可能会返回错误消息(我将整个项目上载到远程服务器):
mysql -u test_ssl -password --ssl-key=/usr/local/apache2/htdocs/certs/client-key.pem --ssl-cert=/usr/local/apache2/htdocs/certs/WRONG-CERTIFICATE.pem我得到以下错误:
SSL error: Unable to get certificate from '/usr/local/apache2/htdocs/certs/WRONG-CERTIFICATE.pem'
ERROR 2026 (HY000): SSL connection error ---> notice the error here如果我根本不提供任何证书,我会得到以下消息:
-bash-3.2$ mysql -u test_ssl -password
ERROR 1045 (28000): Access denied for user 'test_ssl'@'localhost' (using password: YES),这是我使用PHP使用正确或无效路径连接到证书时所遇到的相同错误!!
也许这意味着什么?
发布于 2013-01-26 20:29:25
我们能够解决这个问题,但我不确定这是否是一个实际的解决方案。
首先,我们能够找到问题的来源,即MySql客户端库,即PHP使用SSL连接的库。为了能够使用SSL进行连接,必须对这些库进行PHP编程。
此外,MySql客户端库和OpenSSL库之间存在冲突。
我们问题的唯一解决办法是从头开始重新安装所有的东西。我们使用了一个新的服务器,新的Mysql (最新构建)安装与所有库,最新的PHP和最新的CentOS发行版。
发布于 2012-12-27 10:46:20
乍一看,您没有将MYSQLI_CLIENT_SSL选项设置为connection。
if (!$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db', null, MYSQLI_CLIENT_SSL)) { ... }
更新:
您可以尝试在$mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);之前添加$mysqli->ssl_set()。
同样,这也适用于我:
<?php
$pdo = new PDO('mysql:host=ip;dbname=dbname', 'username', 'password', array(
PDO::MYSQL_ATTR_SSL_KEY =>'/etc/mysql/ssl/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA =>'/etc/mysql/ssl/ca-cert.pem'
)
);
$stmt = $pdo->query("SHOW TABLES;");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
?>更新2:如果您使用旧风格的mysql密码(16字节长),您可能会收到bad handshake。若要检查,请运行以下查询:
mysql> select length(Password) from mysql.user where User='youruser'如果你收到16
// disable old_passwords:
mysql> SET @@session.old_passwords = 0;
// update password for user used in PHP script:
mysql> SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');
// check if we have a 41 bytes long password:
mysql> select length(Password) from mysql.user where User='youruser'并再次检查来自PHP脚本的连接。
https://stackoverflow.com/questions/14053160
复制相似问题