2011-10-04 95 views
1

我发现有很多与使用mysql_connect()调用有关的MYSQL_CLIENT_SSL标志的冲突信息,vs设置和SSH隧道... MYSQL_CLIENT_SSL是否可以接受?官方文件似乎表明是的,但堆栈和其他地方的很多帖子都说隧道更好,但不能解释。PHP到MySQL使用SSL的亚马逊RDS,确认SSL

如果我使用MYSQL_CLIENT_SSL,如何验证实际上是否获得加密连接?我已经将它添加到我的mysql_connect()调用中,并且它不会抛出任何错误,我假设它正在工作,但我怎么能确定?

+0

更确定的方法是使用数据包嗅探器来查看线路上发生了什么。如果你得到随机垃圾,它会被加密。如果你看到你的查询/数据经过,那么它不是。 –

+0

如果它全部在本地网络上,但是当它在托管服务器或云环境中运行时,这并不是一个真正的可行选项,我很害怕。 – ima747

回答

2

您可以使用检查这一点:

$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 
) 
+1

在通过各种搜索和错误日志进行拖网之后,您可能会更安全地使用mysqli来满足SSL要求。看看http://www.php.net/manual/en/mysqli.ssl-set.php – Tom

+0

谢谢,你能提供一些细节,为什么它可能会更好地使用mysqli? – ima747

+0

看看http://stackoverflow.com/questions/1778977/encrypting-mysql-traffic-in-scripts – Tom

0

我知道这是一个老问题,但我也有这个问题,解决它,认为我将分享我为后代的答案。

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());