【问题标题】:Getting empty 'Ssl_cipher' with MySQLdb SSL connection to Amazon RDS使用 MySQLdb SSL 连接到 Amazon RDS 获取空的“Ssl_cipher”
【发布时间】:2014-01-27 17:13:51
【问题描述】:

我刚刚花了一周的时间来解决这个问题中记录的问题:https://stackoverflow.com/questions/21315427/why-does-the-ca-information-need-to-be-in-a-tuple-for-mysqldb

现在已将其归结为一个问题。这是一个连接到我在 Amazon RDS 上的 MySQL 服务器的脚本:

#! /usr/bin/env python
import MySQLdb
ssl = ({'ca': '/home/James/Downloads/mysql-ssl-ca-cert-copy.pem'},)
conn = MySQLdb.connect(host='db.doopdoop.eu-west-n.rds.amazonaws.com', user='user', passwd='pass', ssl=ssl)
cursor = conn.cursor()
cursor.execute("SHOW STATUS LIKE 'Ssl_Cipher'")
print cursor.fetchone()

这给了我('Ssl_cipher', ''),我认为这意味着连接未加密。也尝试过使用 Django 的 manage.py shell 函数,并得到相同的结果。那么,为什么我没有例外?当然,数据在流动,但显然安全性只是被忽略了。任何关于我在这里出错的地方的帮助将不胜感激。

我尝试将 MySQL-Python 更新到 1.2.5,但没有成功。

【问题讨论】:

  • 你使用的是什么版本的 MySQLdb?您使用的是什么版本的 MySQL 客户端库? MySQLdb.get_client_info() 会告诉你这一点。 ssl 参数应该是一个映射,即一个字典。
  • MySQLdb.get_client_info() 给出 5.5.35。根据 pip,这是 MySQL-python 1.2.3。当我之前将 ssl 参数设为字典时(如在另一个问题 linked above 中),它给了我这个错误:_mysql_exceptions.OperationalError: (2026, 'SSL connection error: ASN: bad other signature confirmation')
  • 我再次测试了将 ssl 更改为字典,并且可以确认该行仍然发生异常:ssl = {'ca': '/home/James/Downloads/mysql-ssl-ca-cert-copy.pem'}
  • 1.2.3 很可能在 SSL 方面存在漏洞,因为它非常旧。请至少使用 1.2.4(首选 1.2.5)。
  • 好的。我刚刚安装了 Django 想要的依赖项,但它也是一个旧版本,所以也许可以解释它。谢谢,明天我会更新并通知您。

标签: python django ssl mysql-python amazon-rds


【解决方案1】:

针对您的问题的可能解决方法:使用默认文件。它看起来像这样:

[mysql]
host = db.doopdoop.eu-west-n.rds.amazonaws.com
user = user
password = pass
ssl-ca = /home/James/Downloads/mysql-ssl-ca-cert-copy.pem

然后将您的 connect() 调用更改为:

conn = MySQLdb.connect(read_default_file=options_path)

其中 options_path 是上述文件的路径。这也将身份验证数据排除在您的代码之外。

Django 设置将如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/my.cnf',
        },
    }
}

参考:https://docs.djangoproject.com/en/dev/ref/databases/#connecting-to-the-database

【讨论】:

  • 谢谢,我会试试这个,让你知道。不幸的是,我不知道如何使它与 Django 一起工作,这是主要问题。 MySQLdb 只是原来的共同点。
  • 该配置似乎有效(因为它不会出错),但我仍然得到空的 Ssl_Cipher 值。
  • Django 解决方案非常简单:docs.djangoproject.com/en/dev/ref/databases/…
  • 确实看起来很简单。公平地说,我没有研究过该解决方案如何适用于 Django,因为它不适用于 vanilla。如果我得到你在使用 vanilla 问题的评论中建议的解决方案,我肯定会做出改变以提高代码的安全性。
猜你喜欢
  • 2015-10-27
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2018-05-20
  • 2011-03-11
  • 2012-12-06
  • 2019-07-25
  • 2021-11-17
相关资源
最近更新 更多