它不像内置的开发服务器那么简单,但使用 stunnel 作为浏览器和开发服务器之间的 SSLifying 中间人来接近并不是太难。 Stunnel 允许您在您的计算机上设置一个轻量级服务器,该服务器接受配置端口上的连接,用 SSL 包装它们,并将它们传递给其他服务器。我们将使用它打开一个 stunnel 端口 (8443) 并将它接收到的任何流量传递给 Django runserver 实例。
首先,您需要 stunnel,它可以是 downloaded here 或者可能由您平台的软件包系统提供(例如:apt-get install stunnel)。我将使用第 4 版的 stunnel(例如:/usr/bin/stunnel4 在 Ubuntu 上),第 3 版也可以使用,但有不同的配置选项。
首先在您的 Django 项目中创建一个目录来保存必要的配置文件和 SSLish 内容。
mkdir stunnel
cd stunnel
接下来,我们需要创建用于 SSL 通信的本地证书和密钥。为此,我们求助于 openssl。
创建密钥:
openssl genrsa 2048 > stunnel.key
创建使用此密钥的证书(这将询问您一堆将包含在证书中的信息 - 只需回答您觉得好的任何内容):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
现在将这些组合成一个文件,stunnel 将用于其 SSL 通信:
cat stunnel.key stunnel.cert > stunnel.pem
为 stunnel 创建一个名为 dev_https 的配置文件,内容如下:
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 运行服务器实例(在端口 8000 上)
- 第 3 行:启动另一个 Django runserver 实例(在端口 8001 上)并将其配置为将所有传入连接视为使用 HTTPS 执行。
使我们刚刚创建的 runscript 文件可执行:
chmod a+x runserver
现在,当您要运行开发服务器时,只需从项目目录中执行 ./runserver。要试用它,只需将您的浏览器指向 http://localhost:8000 以获取正常的 HTTP 流量,将 https://localhost:8443 指向 HTTPS 流量。请注意,您的浏览器几乎肯定会抱怨所使用的证书,并要求您添加例外或以其他方式明确指示浏览器继续浏览。这是因为您创建了自己的证书,并且浏览器不相信它可以说出它的真实身份。这对开发来说很好,但显然不会将其用于生产。
不幸的是,在我的机器上,当我按下 Ctrl-C 时,这个 runserver 脚本并没有很好地退出。我必须手动终止进程 - 有人有解决此问题的建议吗?
感谢 Michael Gile 的 post 和 django-weave 的 wiki entry 提供参考资料。