我正在尝试设置到通过Amazon RDS托管的MySQL数据库的SSL连接。我对如何连接感到困惑。
根据亚马逊的documentation,我需要下载一个名为"rds- CA -2015-root.pem“的ca证书,并在我的SSL连接中使用它。SSL将我要连接的数据库用户设置为需要。
在PHP中,我包含了以下代码来启动连接:
$mysqli = mysqli_init();
mysqli_options($mysqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$mysqli->ssl_set(NULL, NULL, "/path/to/pem", NULL, NULL);
$mysqli->real_connect("host", "username", "password", "name", 3306, NULL, MYSQLI_CLIENT_SSL);
但是,无论我将哪个路径指定为ssl_set()中的第三个参数(即使该路径无效),连接都会成功建立。第三个参数不能设置为NULL。
我通过运行以下查询验证这一点:SHOW STATUS LIKE 'Ssl_cipher';
。输出验证连接是否已加密(Ssl_cipher => AES256-SHA)。
有人能给我解释一下这是怎么回事吗?我搞不懂为什么在路径不正确的情况下,连接仍能成功工作。RDS服务器是如何验证的?
发布于 2015-11-18 10:50:51
RDS文档实际上解释了发生这种情况的原因,并建议您甚至不需要CA证书:
Amazon RDS于2015年3月23日开始更新所有数据库实例上的SSL证书,但没有启动实例的重启。执行这些更新时,不会产生操作影响或停机时间,在许多情况下,我们将在您的维护窗口中执行更新。如果您已经执行了更新,Amazon RDS将不会更新您的实例的证书。另请注意,亚马逊RDS不会更新亚马逊网络服务GovCloud (美国)和中国(北京)地区的证书。
无论是手动更新证书还是Amazon RDS更新证书,都必须重新启动数据库实例才能使新证书生效。您可以决定何时手动重新启动数据库实例,但必须在旧证书(rds-ca-2010)于2015年4月3日到期之前更新证书并重新启动实例。
您可以使用Amazon RDS控制台检查DB实例正在使用的证书颁发机构(CA)。CA列在数据库实例详细信息的安全和网络部分下。如果您的实例显示为rds-ca-2015,则新证书已成功应用。您仍然需要重新启动数据库实例并更新客户端应用程序才能使用新的SSL证书。
如果Amazon RDS控制台显示您的实例CA为rds-ca-2010,则新证书尚未应用于您的数据库实例。按照以下说明更新数据库实例上的SSL证书。
第三个参数实际上被客户端忽略了。我打赌通过将第三个参数设置为NULL
,如果所有的参数都为空,那么调用mysqli::ssl_set()
就没有意义了。
尝试完全删除该函数调用。
发布于 2021-10-26 21:47:05
据我所知,无论证书的本地副本是否有效或可读,如果您请求或需要到RDS MySQL的SSL连接,您都会得到一个连接。
我在Drupal中使用以下配置,无论我在cert路径中放在哪里或什么内容,我都会得到一个SSL连接:
$databases['default']['default'] = [
'database' => 'drupal_db',
'username' => 'db_user',
'password' => 'db_password',
'host' => 'hostname',
'port' => '3306',
'driver' => 'mysql',
'prefix' => '',
'pdo' => array(
PDO::MYSQL_ATTR_SSL_CA => '/etc/ssl/certs/rds-combined-ca-bundle.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
),
];
但是,如果我将Drupal值设置为"false“,我会得到一个连接错误,并且MYSQL_ATTR_SSL_VERIFY_SERVER_CERT失败。到目前为止,我还没有找到任何解释,为什么这不会验证证书和/或如何使其成功!
https://stackoverflow.com/questions/31823926
复制相似问题