我有一个使用“安全”cookie 的应用程序,我想测试它的功能,而无需设置复杂的启用 SSL 的开发服务器。有什么方法可以像我使用 ./manage.py runserver
测试非加密请求一样简单吗?
最佳答案
它不像内置开发服务器那样简单,但是使用 stunnel 作为浏览器和开发服务器之间的 SSL 化中间人来接近一些东西并不难。 Stunnel 允许您在您的计算机上设置一个轻量级服务器,该服务器接受配置端口上的连接,使用 SSL 包装它们,并将它们传递给其他服务器。我们将使用它来打开一个 stunnel 端口 (8443),并将它接收到的任何流量传递给 Django runserver 实例。
首先你需要一个可以是downloaded here的stunnel或者可能由您平台的包系统提供(例如:apt-get install stunnel
)。我将使用第 4 版的 stunnel(例如:Ubuntu 上的 /usr/bin/stunnel4
),第 3 版也可以使用,但具有不同的配置选项。
首先在你的 Django 项目中创建一个目录来保存必要的配置文件和 SSLish 的东西。
mkdir stunnel
cd stunnel
接下来我们需要创建一个本地证书和 key 以用于 SSL 通信。为此,我们求助于 openssl。
创建 key :
openssl genrsa 2048 > stunnel.key
创建使用此 key 的证书(这将询问您一系列信息,这些信息将包含在证书中 - 只需回答您觉得合适的内容即可):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
现在将这些组合到一个文件中,stunnel 将用于其 SSL 通信:
cat stunnel.key stunnel.cert > stunnel.pem
为名为 dev_https 的 Stunnel 创建一个配置文件,内容如下:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
此文件告诉 stunnel 它需要知道的内容。具体来说,你告诉它不要使用 pid 文件,证书文件在哪里,使用什么版本的 SSL,它应该在前台运行,它应该在哪里记录它的输出,它应该接受端口上的连接8443 并将它们穿梭到端口 8001。最后一个参数 (TIMEOUTclose) 告诉它在 1 秒无事件后自动关闭连接。
现在回到你的 Django 项目目录(里面有 manage.py 的目录):
cd ..
在这里我们将创建一个名为 runserver 的脚本,它将运行 stunnel 和两个 django 开发服务器(一个用于普通连接,一个用于 SSL 连接):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
让我们逐行分解:
- 第 1 行:启动 stunnel 并将其指向我们刚刚创建的配置文件。这在端口 8443 上有 stunnel 监听,将它接收到的任何连接包装在 SSL 中,并将它们传递到端口 8001
- 第 2 行:启动一个普通的 Django runserver 实例(在端口 8000 上)
- 第 3 行:启动另一个 Django runserver 实例(在端口 8001 上)并将其配置为将所有传入连接视为使用 HTTPS 执行。
使我们刚刚创建的运行脚本文件可执行:
chmod a+x runserver
现在,当您想要运行您的开发服务器时,只需从您的项目目录执行 ./runserver
。要试用它,只需将浏览器指向 http://localhost:8000 以获取正常的 HTTP 流量,将浏览器指向 https://localhost:8443 以获取 HTTPS 流量。请注意,您的浏览器几乎肯定会提示使用的证书并要求您添加异常(exception)或以其他方式明确指示浏览器继续浏览。这是因为您创建了自己的证书,并且浏览器不相信它会说出关于它是谁的真相。这对开发来说很好,但显然不会减少生产。
不幸的是,在我的机器上,当我按下 Ctrl-C 时,这个 runserver 脚本并没有很好地退出。我必须手动终止进程 - 有人有解决这个问题的建议吗?
感谢 Michael Gile 的 post和 django-weave 的 wiki entry供引用。
关于django - 如何使用 Django 测试 https 连接,就像使用 'runserver' 测试非 https 连接一样容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023126/