如何使用 Embarcadero FireDAC 在 AWS RDS 上托管的 MariaDB 上设置 SSL

How to setup SSL on MariaDB hosted on AWS RDS with Embarcadero FireDAC

我正在尝试通过 SSL 连接到托管在 AWS RDS 上的 MariaDB 实例

查看文档:http://docwiki.embarcadero.com/RADStudio/Rio/en/Connect_to_MySQL_Server_(FireDAC)

看来我需要设置这 4 个参数:

UseSSL=True
SSL_ca=ca-cert.pem
SSL_cert=client-cert.pem
SSL_key=client-key.pem

但亚马逊只给了我一个 rds-combined-ca-bundle.pem

我对TLS/SSL了解不多。我需要生成那些 .pem 文件吗? 如果是,如何?

我也试过这样做:

            db_params->Add("DriverID=MySQL");
            db_params->Add("Server=my.rds.url.com");
            db_params->Add("Port=9999");
            db_params->Add("Database=my_database");
            db_params->Add("User_Name=my_user");
            db_params->Add("Password=my_password");
            db_params->Add("UseSSL=True");
            db_params->Add("SSL_ca=absolute\path\to\rds-combined-ca-bundle.pem");

但它引发了异常

[FireDAC][Phys][MySQL] SSL connection error

没有用户名和密码也是一样...

提前致谢!

聚会迟到了,但其他人可能需要这个。

1.服务器

首先,您必须确保您的用户在身份验证时使用 SSL/TLS 加密。在 MySQL 控制台中,运行 以下 SQL 语句:

SHOW GRANTS FOR 'my_user';
+---------------------------------------------------------------------------------------------+
| Grants for my_user@%                                                                        |
+---------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, ... ON *.* TO `my_user`@`%` IDENTIFIED BY PASSWORD '*...' REQUIRE SSL |
+---------------------------------------------------------------------------------------------+

如果结果不包含 REQUIRE SSL,您需要为您的用户启用 SSL / TLS:

ALTER USER 'my_user' REQUIRE SSL;
FLUSH PRIVILEGES;

运行 SHOW GRANTS 声明再次确认您的用户现在正在使用 SSL/TLS。

当然,你必须运行所有这些都在admin / root下,否则你将无法授予权限。

2。证书

然后,您必须下载正确的证书,具体取决于您的 RDS 实例所在的位置(例如美国东部(俄亥俄州)-> us-east-2-bundle.pem)。将该 .pem 保存在您选择的路径中。我将我的保存在我的可执行文件的相对路径中(例如“./Cert”)。

您可以从 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html 下载证书。

3。代码

您基本上是正确的,但为了保持一致性,我将从头开始设置连接上的所有内容。这是 Pascal 代码,但您会明白这一点。

DBConnection.LoginPrompt := False;
DBConnection.ConnectedStoredUsage := [auRunTime];
DBConnection.ConnectionName := 'my_db_connection';
DBConnection.ResourceOptions.AutoConnect := False;
DBConnection.Params.DriverID := 'MySQL';
DBConnection.Params.Database := 'my_database';
DBConnection.Params.UserName := 'my_user';
DBConnection.Params.Password := 'my_password';
DBConnection.Params.Add('Server=my.rds.url.com');
DBConnection.Params.Add('Port=9999');
DBConnection.Params.Add('LoginTimeout=15');
DBConnection.Params.Add('UseSSL=True');
DBConnection.Params.Add('SSL_capath=./Cert');
DBConnection.Params.Add('SSL_ca=./Cert/us-east-2-bundle.pem');
DBConnection.Open;