PHP到MySQL的Amazon RDS使用SSL,确认SSL


PHP to MySQL Amazon RDS with SSL, confirm SSL

我发现很多关于MYSQL_CLIENT_SSL标志与mysql_connect()调用的使用冲突的信息,vs设置和SSH隧道…MYSQL_CLIENT_SSL是否可以接受?官方文件似乎表明可以,但是stack和其他地方的许多帖子都说隧道更好,但没有解释。

如果我使用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的文档很有帮助。首先,您需要下载mysql-ssl-ca-cert。pem文件从Amazon(见链接)。然后尝试使用该文件从终端连接。

mysql --host=mydb.c83ks9ckdk39.us-east-1.rds.amazonaws.com --user=myuser -p --ssl_ca=mysql-ssl-ca-cert.pem

Amazon说您可以使用grant语句来限制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,你可以运行Tom的查询来确认你是否想要。

$rs = $link->query("SHOW STATUS LIKE 'ssl_cipher'");
print_r($rs->fetch_assoc());