我有一个使用“安全” cookie的应用程序,并且想要测试其功能而无需设置复杂的启用SSL的开发服务器。有什么方法可以像我可以使用来测试未加密的请求那样简单./manage.py runserver吗?
./manage.py runserver
它不像内置的开发服务器那么简单,但是使用stunnel作为浏览器和开发服务器之间的SSLifying中间人来达成某种目标并非难事。使用Stunnel,你可以在计算机上设置轻量级服务器,该服务器可以在配置的端口上接受连接,并使用SSL包装它们,然后将其传递给其他服务器。我们将使用它打开一个stunnel端口(8443),并将接收到的所有流量传递给Django runserver实例。
首先,你需要一个stunnel,可以在这里下载,也可以由平台的打包系统提供(例如:)apt-get install stunnel。我将使用stunnel的版本4(例如:/usr/bin/stunnel4在Ubuntu上),版本3也可以使用,但是具有不同的配置选项。
apt-get install stunnel
/usr/bin/stunnel4
首先在Django项目中创建一个目录,以保存必要的配置文件和SSLish内容。
mkdir stunnel cd stunnel
接下来,我们需要创建用于SSL通信的本地证书和密钥。为此,我们转向openssl。
创建密钥:
openssl genrsa 1024 > stunnel.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的配置文件:
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
让我们逐行将其分解:
chmod a+x runserver
现在,当你要运行开发服务器时,只需./runserver从项目目录执行即可。要进行尝试,只需将浏览器指向http:// localhost:8000(用于正常的HTTP流量)和https:// localhost:8443(用于HTTPS流量)即可。请注意,你使用的浏览器几乎肯定会抱怨所使用的证书,并要求你添加例外或以其他方式明确指示浏览器继续浏览。这是因为你创建了自己的证书,并且浏览器不信任该证书来告知真实身份。这对开发来说很好,但是显然不会削减它的生产量。
不幸的是,在我的机器上,当我按Ctrl-C时,该runserver脚本无法很好地退出。我必须手动终止进程-有人建议解决该问题吗?