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

9

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

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

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

通常,这将在database.yml中指定为一个值,但由于Heroku为我们生成database.yml,我不确定如何控制此设置。

谢谢!

2个回答

17
你可以通过DATABASE_URL配置来指定一些mysql2 SSL参数。它们将作为项目添加到动态database.yml中,在Heroku构建过程中生成,因此在创建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;

故障排除

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

SSL connection error: ASN: bad other signature confirmation

甚至只是:

SSL connection error

如果CA证书文件的引用有问题,那么很可能存在问题。


2
第三步:-a <app_id> 应该是什么?是指 Heroku 应用的名称吗? - jmogera
2
如果您只有一个应用程序,则通常可以跳过 {app_id}。在终端中使用 heroku apps 查看属于登录用户的应用程序。 - Marc
1
此外,我还需要将mysql端口添加到我们的安全组中。源是:0.0.0.0/0,端口范围是:3306。 - djburdick
@djburdick - 小心!允许0.0.0.0/0(或任何/0)的来源将会向全世界打开您的数据库防火墙。不幸的是,这是Heroku目前的建议,但您应该意识到这就是您正在做的事情。 - fotinakis
@fotinakis 同意!感谢你指出这个问题。我实际上向他们的支持团队提出了请求:)。在这里回答:https://dev59.com/hqnns4cB2Jgan1zndvB1#22946021?noredirect=1#22946021 - djburdick

1

1
谢谢Neil。那个很好用!更具体地说,我的Heroku配置DATABASE_URL看起来像这样:mysql2://username:password@hostname/databasename?sslca=/path/to/ca.pem - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接