从Django连接到RDS MySQL时出现SSL连接错误

时间:2013-12-20 18:11:28

标签: mysql django ssl heroku amazon-rds

我正在尝试使用RDS实例作为数据库后端在Heroku上部署Django应用程序。一切正常,直到我尝试加密连接,然后我收到此错误:

OperationalError at /path/
(2026, 'SSL connection error')

以下是设置:

  • 标准Django应用程序
  • 具有安全组的MySQL RDS实例,允许来自所有IP地址的连接
  • MySQL用户设置为允许来自任何主机的连接
  • 亚马逊的pem已下载并在Django设置中指定

On Heroku:

DATABASE_URL: mysql2://username:password@instance.us-east-1.rds.amazonaws.com:3306/name_staging?sslca=path/to/mysql-ssl-ca-cert.pem

在Django设置中:

DATABASES = {
    'default': dj_database_url.config()
}
DATABASES['default']['OPTIONS'] = {'ssl': {'ca': 'mysql-ssl-ca-cert.pem'}}`

我已经尝试过搜索并阅读了很多关于在Rails中设置这种环境的文章,但是关于使用Django进行此操作的文档很少见。

有没有人成功部署了类似的设置,或者有没有人想过如何解决这个错误?

更新

通过cli连接以及在python解释器中使用MySQLdb直接连接。

1 个答案:

答案 0 :(得分:7)

解决:

pem文件的路径必须是绝对的,你不能使用python来尝试构建绝对路径。

DATABASES = {
    'default': dj_database_url.config()
}
DATABASES['default']['OPTIONS'] = {
    'ssl': {'ca': '/app/project_name/rds/mysql-ssl-ca-cert.pem'}
}

同样,检测这样的路径不起作用,路径必须是硬编码的:

DATABASES['default']['OPTIONS'] = {
    'ssl': {'ca': os.path.join(os.path.dirname(__file__), 'rds', 'mysql-ssl-ca-cert.pem')}
}