我有一个使用"安全"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

让我们逐行分析一下:

  • 第1行:启动stunnel并将其指向我们刚刚创建的配置文件.这让stunnel监听端口8443,将它接收到的所有连接封装在SSL中,并将它们传递到端口8001
  • 第2行:启动一个普通的Django runserver实例(在端口8000上)
  • 第3行:启动另一个Django runserver实例(在端口8001上),并将其配置为将所有传入连接视为使用HTTPS执行.

使我们刚刚创建的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 .

Django相关问答推荐

Django动态页面.为什么我的代码不工作?

如何在Django模板中为无效词典查找打开异常?

Django如何在没有ctrl点击的情况下允许多选

身份验证有效,但登录无效.一直卡在pending

如何连接到 docker 容器中的 postgres 数据库?

在 Django Rest Framework 视图中,request.user 是在请求​​到达视图之前进行数据库调用还是数据库调用发生?

Django 如何知道我的数据库的路径?

未为部署的 django rest 框架加载静态文件

如何让两个模型相互引用 Django

Django ORM 和锁定表

ModelForm 的 Django TextField max_length 验证

Django Calendar日历小部件?

如何在 Django 和 django-jsonfield 中将 JSONField 的默认值设置为空列表?

在 Mac OS X 上安装支持 JPEG 的 PIL

Django 什么是反向关系?

如何在 Django/Python 中减go 两个日期?

如何重置 PostgreSQL 表上的 ID 序列

UpdateView 中的success_url,基于传递的值

Django中GROUP BY中注释的聚合

如何使用 Django/nginx 部署仅限 HTTPS 的站点?