我有一个使用"安全"cookie的应用程序,并且希望在不需要设置复杂的支持SSL的开发服务器的情况下测试其功能.有没有办法像我使用./manage.py runserver
测试非加密请求一样简单地做到这一点?
我有一个使用"安全"cookie的应用程序,并且希望在不需要设置复杂的支持SSL的开发服务器的情况下测试其功能.有没有办法像我使用./manage.py runserver
测试非加密请求一样简单地做到这一点?
它不像内置的开发服务器那样简单,但使用stunnel作为浏览器和开发服务器之间的可靠中间人也不难接近.Stunnel允许您在机器上设置一个轻量级服务器,该服务器在配置的端口上接受连接,用SSL封装它们,并将它们传递给其他服务器.我们将使用它打开一个stunnel端口(8443),并将它接收到的任何流量传递给Django runserver实例.
首先,您将需要downloaded here或您的平台的软件包系统(例如:apt-get install stunnel
)提供的stantnel,它可以是downloaded here或可能是由您的平台的软件包系统提供的.我将使用stantnel的版本4(例如:Ubuntu上的/usr/bin/stunnel4
),版本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
现在,将这些内容合并到一个文件中,该文件将用于它的SSL通信:
cat stunnel.key stunnel.cert > stunnel.pem
创建一个名为dev_https、包含以下内容的Stustnel配置文件:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
这个文件告诉了特技频道它需要知道的事情.具体地说,您告诉它不要使用PID文件,证书文件在哪里,使用什么版本的SSL,它应该在前台运行,在那里记录它的输出,并且它应该接受端口8443上的连接并将它们穿梭到端口8001.最后一个参数(TIMEOUTclose)告诉它在1秒内没有任何活动后自动关闭连接.
现在弹回Django项目目录(其中包含manage.py的那个目录):
cd ..
在这里,我们将创建一个名为runserver的脚本,该脚本将运行tunnel和两个Django开发服务器(一个用于普通连接,另一个用于SSL连接):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
让我们逐行分析一下:
使我们刚刚创建的runscript文件可执行:
chmod a+x runserver
现在,当您想要运行开发服务器时,只需从项目目录执行./runserver
即可.要try 一下,只需将浏览器指向http://localhost:8000对于正常的HTTP通信,以及https://localhost:8443用于HTTPS流量.请注意,您的浏览器几乎肯定会抱怨使用的证书,并要求您添加异常或以其他方式明确指示浏览器继续浏览.这是因为您创建了自己的证书,而浏览器不相信该证书会说出该证书的真实身份.这对开发来说很好,但显然不会减少生产.
不幸的是,在我的机器上,当我按Ctrl-C组合键时,这个运行服务器脚本不能很好地退出.我必须手动终止进程--有没有人有建议来解决这个问题?
感谢Michael Gile的post和Django-weave的wiki entry作为参考material .