一尘不染

如何使用``runserver''与非https连接一样轻松地测试与Django的https连接?

django

我有一个使用“安全” cookie的应用程序,并且想要测试其功能而无需设置复杂的启用SSL的开发服务器。有什么方法可以像我可以使用来测试未加密的请求那样简单./manage.py runserver吗?


阅读 426

收藏
2020-03-29

共1个答案

一尘不染

它不像内置的开发服务器那么简单,但是使用stunnel作为浏览器和开发服务器之间的SSLifying中间人来达成某种目标并非难事。使用Stunnel,你可以在计算机上设置轻量级服务器,该服务器可以在配置的端口上接受连接,并使用SSL包装它们,然后将其传递给其他服务器。我们将使用它打开一个stunnel端口(8443),并将接收到的所有流量传递给Django runserver实例。

首先,你需要一个stunnel,可以在这里下载,也可以由平台的打包系统提供(例如:)apt-get install stunnel。我将使用stunnel的版本4(例如:/usr/bin/stunnel4在Ubuntu上),版本3也可以使用,但是具有不同的配置选项。

首先在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

让我们逐行将其分解:

  • 第1行:启动stunnel,并将其指向我们刚刚创建的配置文件。该通道在端口8443上有通道监听,将收到的所有连接封装为SSL,然后将其传递到端口8001
  • 第2行:启动普通的Django Runserver实例(在端口8000上)
  • 第3行:启动另一个Django Runserver实例(在端口8001上),并将其配置为将所有传入连接都视为使用HTTPS执行。
    使用以下命令使我们刚刚创建的runscript文件可执行:
chmod a+x runserver

现在,当你要运行开发服务器时,只需./runserver从项目目录执行即可。要进行尝试,只需将浏览器指向http:// localhost:8000(用于正常的HTTP流量)和https:// localhost:8443(用于HTTPS流量)即可。请注意,你使用的浏览器几乎肯定会抱怨所使用的证书,并要求你添加例外或以其他方式明确指示浏览器继续浏览。这是因为你创建了自己的证书,并且浏览器不信任该证书来告知真实身份。这对开发来说很好,但是显然不会削减它的生产量。

不幸的是,在我的机器上,当我按Ctrl-C时,该runserver脚本无法很好地退出。我必须手动终止进程-有人建议解决该问题吗?

2020-03-29