2012-03-16 59 views
6

我在Heroku的Cedar栈上运行Rails 3.2应用程序。为Heroku外部MySQL数据库连接指定SSL

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

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

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

谢谢!

回答

1

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

理论上,这应该让你配置它,你想如何,但我没有尝试过。

+1

谢谢尼尔。这很好用!更具体地说,我的Heroku配置DATABASE_URL类似于:mysql2:// username:password @ hostname/databasename?sslca =/path/to/ca.pem – Nathan 2012-03-21 02:41:22

12

您可以通过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:[email protected]/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证书文件的引用方式可能有问题。

+2

步骤3:什么是-a 假设是?是heroku应用程序的名称? – jmogera 2014-01-28 22:21:38

+2

如果您只有一个应用,通常可以跳过{app_id}。在终端中使用'''heroku apps'''来查看哪些应用程序属于登录用户。 – 2014-02-12 00:59:48

+1

此外,我不得不将mysql端口添加到我们的安全组。源代码是:0.0.0.0/0,端口范围是:3306 – djburdick 2014-04-08 17:58:42