为Heroku外部MySQL数据库连接指定SSL

Nat*_*han 7 mysql ssl heroku ruby-on-rails-3

我在Heroku的Cedar堆栈上运行Rails 3.2应用程序.

我正在使用Amazon RDS作为我的MySQL数据库,我在Heroku配置变量中设置了正确的DATABASE_URL.

如何让Heroku在与Amazon RDS的连接中使用SSL?

通常这将被指定为database.yml中的值,但由于Heroku为我们生成了database.yml,我不知道如何控制此设置.

谢谢!

fot*_*kis 15

您可以通过配置指定一些mysql2 SSL参数DATABASE_URL.它们将作为项添加到database.ymlHeroku构建过程中生成的动态中,因此它们将在创建mysql2连接时传递.

你需要传递给它的唯一参数是sslca(不要混淆sslcapath).

1.下载Amazon RDS CA证书并将其与您的应用捆绑在一起.

(编辑)亚马逊将在2015年3月轮换此证书.您将需要该页面中的新文件而不是此文件.

curl https://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem > ./config/amazon-rds-ca-cert.pem

2.将文件添加到git,然后重新部署到Heroku.

3. DATABASE_URL改为通过sslca:

heroku config:add DATABASE_URL="mysql2://username:password@hostname/dbname?sslca=config/amazon-rds-ca-cert.pem -a <app_id>

那里的相对路径很重要 - 见下文.

而已!现在您已经使用SSL了,您可能希望强制所有与该用户的连接仅允许SSL:

GRANT USAGE ON dbname.* TO 'username'@'%' REQUIRE SSL;
Run Code Online (Sandbox Code Playgroud)

故障排除

确保通过相对路径sslca!否则,rake assets:precompile可能会因SSL错误而中断.如果您收到如下错误:

SSL connection error: ASN: bad other signature confirmation
Run Code Online (Sandbox Code Playgroud)

甚至只是:

SSL connection error
Run Code Online (Sandbox Code Playgroud)

...那么CA证书文件的引用方式可能有问题.

  • 在第3步:-a <app_id>假设是什么?是heroku应用程序的名称? (2认同)
  • 如果您只有一个应用程序-a {app_id}通常可以跳过.在终端中使用```heroku apps```查看哪些应用程序属于登录用户. (2认同)

Nei*_*ton 1

通过查看注入的database.yml(请参见http://neilmiddleton.com/sharing-databases- Between-heroku-applications/的底部),您可以将额外的配置作为数据库URL的一部分作为查询参数传递。

理论上,这应该让你可以按照你想要的方式配置它,尽管我还没有尝试过。