【问题标题】:How to connect Django to a MySQL database over an SSL connection?如何通过 SSL 连接将 Django 连接到 MySQL 数据库?
【发布时间】:2011-05-18 10:44:27
【问题描述】:

我正在尝试将 Django 连接到可通过 SSL 连接访问的 MySQL 数据库。我该如何配置?

我的第一个猜测是设置数据库定义的“OPTIONS”属性。但是,我找不到有关可以使用哪些选项的信息。 'ssl': '/map/to/ca-cert.pem' 选项不起作用。

以下命令似乎有效:

mysql -h url.to.host -u lizard -p --ssl-ca=./ca-cert.pem

编辑:好的,我正在查看 python-mysqldb 文档...也许我可以在那里找到答案。

【问题讨论】:

    标签: mysql django ssl


    【解决方案1】:

    必须为 MySQL 客户端提供三个密钥:

    • CA 证书
    • 客户端证书
    • 客户端密钥

    有关创建这些密钥和设置服务器的说明,请参阅 MySQL documentation

    注意:有一个open issue 似乎与使用 openssl v1.0.1 为 mysql 5.5.x 创建证书有关

    这是 Django 设置文件的示例条目:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  
            'NAME': '<DATABASE NAME>',                     
            'USER': '<USER NAME>',
            'PASSWORD': '<PASSWORD>',
            'HOST': '<HOST>', 
            'PORT': '3306',
            'OPTIONS':  {
                'ssl': {'ca': '<PATH TO CA CERT>',
                'cert': '<PATH TO CLIENT CERT>',
                'key': '<PATH TO CLIENT KEY>'
                }
            }
        }
    }
    

    【讨论】:

    • 我不完全确定第一句中的“必须是”是否正确,除非正在使用 cert+key authentication(与仅加密网络流量相反) .
    【解决方案2】:

    如果是SSL加密连接可能需要cipher参数

    DATABASE = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db_name',
            'USER': 'user',
            'PASSWORD': 'pass',
            'HOST': 'host',
            'PORT': '3306',
            'OPTIONS': {
                'ssl': {
                    'ca': 'path/to/pem',
                    'key': 'path/to/pem',
                    'cert': 'path/to/pem',
                    'cipher': 'AES128-SHA' #| 'AES128-SHA256' | 'DHE-RSA-AES256-SHA'
                }
            }
        }
    }
    

    MySQL 将默认密码列表传递给 SSL 库。 更多细节可以在这里找到:

    1. https://dev.mysql.com/doc/refman/5.7/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration
    2. https://dev.mysql.com/doc/refman/5.7/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-negotiation

    不能将 cmets 留给@Drew 回答,所以让它成为新的。

    【讨论】:

      【解决方案3】:

      我收到“SSL 连接错误:SSL_CTX_set_default_verify_paths 失败”) "运行时出错python manage.py migrate

      我使用 pip 安装 django-mysql-ssl 包。它仍然无法正常工作。我不得不将“ca”更改为“ssl-ca”,现在它可以工作了。

      'OPTIONS':  {
                          'ssl': {'ssl-ca': '<PATH TO CA CERT>',
      
                                  }
                            }
      

      我不确定它是否真的在使用加密,但它不再引发错误。我正在运行连接到 AWS mariaDB 实例的本地 django 应用程序。

      编辑:从 Django 1.8 开始不需要 django-mysql-ssl 包,因为该功能现在是内置的。 See Dependencies section in the package description here

      依赖关系

      此应用程序已确认可与 Django 1.5 一起使用。它也应该 使用 Django 1.6-1.7。 Django 1.8 不需要这个插件, 因为该功能已内置于核心中。

      【讨论】:

      • 我遇到了同样的错误,'ssl': {'ssl-ca': '&lt;PATH TO CA CERT&gt;' 也为我工作。另外,我看到 CA 证书的路径可以是任何东西,甚至不存在,它仍然可以正常工作。见stackoverflow.com/a/54543985/8645590
      • “我不确定它是否真的使用加密” @BBaker,连接将被加密,我通过SHOW SESSION STATUS LIKE 'Ssl_cipher'检查。
      【解决方案4】:

      Django 使用 Python MySQLdb 库与 MySQL 交互。查看the MySQLdb connection documentation,看起来ssl 选项需要字典参数。所以这可能有效:

      'OPTIONS': {'ssl': {'key': '/map/to/ca-cert.pem'}}
      

      【讨论】:

      猜你喜欢
      • 2014-06-17
      • 2017-10-19
      • 2016-09-20
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多