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

时间:2012-03-16 16:33:04

标签: mysql ruby-on-rails-3 ssl heroku

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:13)

您可以通过DATABASE_URL配置指定some mysql2 SSL params。它们将作为项添加到Heroku构建过程中生成的动态database.yml中,因此在创建mysql2连接时它们将被传递。

您需要传递的唯一参数是sslca(不要与sslcapath混淆)。

<强> 1。下载Amazon RDS CA certificate并将其与您的应用捆绑在一起。

(编辑)亚马逊将于2015年3月成为rotating this certificate。您将需要该页面中的新文件而非此文件。

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;

故障排除

确保将相对路径传递给sslca!否则,rake assets:precompile可能会因SSL错误而中断。如果您收到如下错误:

SSL connection error: ASN: bad other signature confirmation

甚至只是:

SSL connection error

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

答案 1 :(得分:1)

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

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