Ruby Datamapper 通过 SSL 连接到 Amazon RDS 上的 MariaDB

Ruby Datamapper connection with SSL to MariaDB on Amazon RDS

如何使用 SSL 与 Amazon RDS 上的 MariaDB 建立 ruby Datamapper 连接?

这是我所做的:

非 SSL 连接在测试时有效:

uri = 'mysql://user:pass@host:port/db_name'
connection = DataObjects::Connection.new(uri)
=> #<DataObjects::Mysql::Connection:0x000056179a3a5921

connection.secure?
=> false

根据 MySQL datamapper wiki,ssl 连接需要以下选项::ssl_ca, :client_key, and :client_cert.

这将导致以下代码:

uri = 'mysql://user:pass@host:port/db_name?'
ssl_opts = 'ssl[ssl_ca]=file&ssl[client_key]=file&ssl[client_cert]=file'

connection = DataObjects::Connection.new(uri + ssl_opts)
connection.secure?
=> false

但是唯一得到的文件是 RDS combind CA bundle, refered from the RDS docs

我根本没有client_cert。

在 cli 上与 mysql 客户端连接使用 SSL:

mysql --ssl -h host -u user -p pass db_name
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1638
Server version: 10.1.26-MariaDB MariaDB Server

在文档中

https://github.com/datamapper/do/wiki/MySQL

它还说

  • 仅经过测试 ca_cert 才能连接到 RDS。

所以尝试只添加 ca_cert 路径并进行测试

只需要一个参数::ssl => {:ca_cert => 'pem_file'}.

不过,使用 uri 字符串进行配置似乎不起作用。原因是 Addressable::Uri 中的限制。它无法处理旨在表示超过 1 级的哈希的查询字符串。

好消息是它可以使用 DataMapper.setup 和配置哈希:

DataMapper.setup(:default, 
    :adapter  => 'mysql', 
    :user     => 'user',
    :database => 'db_name',
    :host     => 'host',
    :password => 'pass',
    :ssl => { 
        :ca_cert  => '/path/to/rds-combined-ca-bundle.pem'
    }
)