PHP到MySQL使用SSL的亚马逊RDS,确认SSL
问题描述:
我发现有很多与使用mysql_connect()调用有关的MYSQL_CLIENT_SSL标志的冲突信息,vs设置和SSH隧道... MYSQL_CLIENT_SSL是否可以接受?官方文件似乎表明是的,但堆栈和其他地方的很多帖子都说隧道更好,但不能解释。PHP到MySQL使用SSL的亚马逊RDS,确认SSL
如果我使用MYSQL_CLIENT_SSL,如何验证实际上是否获得加密连接?我已经将它添加到我的mysql_connect()调用中,并且它不会抛出任何错误,我假设它正在工作,但我怎么能确定?
答
您可以使用检查这一点:
$connection = mysql_connect([host], [username], [password], false, MYSQL_CLIENT_SSL)
or die(mysql_error());
$res = mysql_query("SHOW STATUS LIKE 'ssl_cipher';", $connection);
print_r(mysql_fetch_row($res));
输出应该是这样的
Array
(
[0] => Ssl_cipher
[1] => xxx-xxx-xxxxxx-xxx
)
答
我知道这是一个老问题,但我也有这个问题,解决它,认为我将分享我为后代的答案。
Amazon's docs是非常有帮助的。首先,您需要从Amazon下载mysql-ssl-ca-cert.pem文件(请参阅链接)。然后尝试使用该文件从终端进行连接。
mysql --host=mydb.c83ks9ckdk39.us-east-1.rds.amazonaws.com --user=myuser -p --ssl_ca=mysql-ssl-ca-cert.pem
亚马逊说,你可以使用这个授权语句来限制连接到SSL,所以在连接时运行这个语句。
GRANT USAGE ON *.* TO 'myuser'@'%' REQUIRE SSL
现在断开连接并尝试再次连接,而没有“--ssl_ca = mysql-ssl-ca-cert.pem”标志。如果您被拒绝,那么您知道此用户现在需要SSL连接。现在你只需要正确设置php。类似这样的:
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$link->ssl_set(NULL,NULL,"mysql-ssl-ca-cert.pem",NULL,NULL);
$ok = $link->real_connect($MYSQL['host'], $MYSQL['user'], $MYSQL['pass'], $MYSQL['db'], 3306, NULL, MYSQLI_CLIENT_SSL);
如果你可以连接,那么你使用SSL连接,你可以运行汤姆的查询来确认你是否想要。
$rs = $link->query("SHOW STATUS LIKE 'ssl_cipher'");
print_r($rs->fetch_assoc());
更确定的方法是使用数据包嗅探器来查看线路上发生了什么。如果你得到随机垃圾,它会被加密。如果你看到你的查询/数据经过,那么它不是。 –
如果它全部在本地网络上,但是当它在托管服务器或云环境中运行时,这并不是一个真正的可行选项,我很害怕。 – ima747