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

标签 ssl mariadb c++builder rds 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. 代码
您基本上是正确的,但为了保持一致性,我将从头开始设置连接上的所有内容。这是帕斯卡代码,但你会明白的。
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;

关于ssl - 如何使用 Embarcadero FireDAC 在 AWS RDS 上托管的 MariaDB 上设置 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56299582/

相关文章:

php - 在哪里可以找到创建单向注册和登录系统的教程?

docker - 无法使用 Docker Compose 提供的 Drupal 应用程序从 API 获取或发布数据

c++ - TRegEx::IsMatch 始终为假

C++Builder 强制编译一个特殊文件

mysql - 在 mariadb 上启用 SSL

delphi - 如何在资源脚本的数据部分中使用宏?

api - 适用于 Windows 的 cURL 无法与 Stack API 建立安全连接

wordpress - 用于 Wordpress 和独立文件夹的 HTTPS 重定向

c++ - 如何将 Unicode 字符串连接成字符串以传递给 mysql 调用

mysql - 使用 MySQL 或 MariaDB 存储位置