我怎样才能testingHTTPS的连接与Django一样容易,我可以非HTTPS连接使用“runserver”?
我有一个应用程序使用“安全”的cookie,并希望testing它的function,而不需要build立一个复杂的SSL启用开发服务器。 有没有办法做到这一点,因为我可以使用./manage.py runserver
testing非encryption请求?
这并不像内置的开发服务器那么简单,但是使用stunnel作为浏览器和开发服务器之间的SSL中间人来closures它并不难。 Stunnel允许您在您的机器上设置一个轻量级的服务器,该服务器接受已configuration端口上的连接,将其封装在SSL中,并将它们传递给其他服务器。 我们将使用它来打开一个stunnel端口(8443),并将它接收到的任何stream量传递给一个Django runserver实例。
首先你需要stunnel,可以在这里下载或者可以由你的平台的包系统提供(例如: apt-get install stunnel
)。 我将使用stunnel的版本4(例如:Ubuntu上的/usr/bin/stunnel4
),版本3也可以工作,但具有不同的configuration选项。
首先在你的Django项目中创build一个目录,以保存必要的configuration文件和SSLish的东西。
mkdir stunnel cd stunnel
接下来,我们需要创build一个用于SSL通信的本地证书和密钥。 为此,我们转向openssl。
创build密钥:
openssl genrsa 1024 > stunnel.key
创build使用这个密钥的证书(这将会问你一些信息将被包含在证书中 – 只要回答你感觉好的东西):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
现在将它们组合成一个单独的文件,stunnel将用它的SSL通信:
cat stunnel.key stunnel.cert > stunnel.pem
为以下内容创build名为dev_https的stunnel的configuration文件:
pid= cert = stunnel/stunnel.pem sslVersion = SSLv3 foreground = yes output = stunnel.log [https] accept=8443 connect=8001 TIMEOUTclose=1
这个文件告诉stunnel它需要知道什么。 具体而言,您告诉它不要使用pid文件,证书文件的位置,要使用哪个版本的SSL,应该在前台运行,应该在哪里logging其输出,并且应该接受端口上的连接8443并将它们传送到端口8001.最后一个参数(TIMEOUTclose)告诉它在1秒钟过去后自动closures连接,没有活动。
现在回到您的Django项目目录(其中包含manage.py):
cd ..
这里我们将创build一个名为runserver的脚本,它将运行stunnel和两个django开发服务器(一个用于正常连接,一个用于SSL连接):
stunnel4 stunnel/dev_https & python manage.py runserver& HTTPS=1 python manage.py runserver 8001
让我们逐行分解:
- 第1行:启动stunnel并将其指向我们刚刚创build的configuration文件。 这通过监听端口8443,包装它在SSL中收到的任何连接,并将它们传递到端口8001
- 第2行:启动一个正常的Django runserver实例(在端口8000上)
- 第3行:启动另一个Django runserver实例(在端口8001上)并将其configuration为将所有传入连接视为正在使用HTTPS执行。
使刚刚创build的脚本文件成为可执行文件:
chmod a+x runserver
现在,当你想运行你的开发服务器时,只需从项目目录中执行./runserver
。 要试用它,只需将浏览器指向http:// localhost:8000即可获得正常的HTTP通信,而将https:// localhost:8443指向HTTPS通信即可。 请注意,您的浏览器几乎肯定会抱怨使用的证书,并要求您添加一个例外或明确指示浏览器继续浏览。 这是因为你创build了自己的证书,浏览器不信任它来告诉他们是谁。 这对发展很好,但显然不会削减生产。
不幸的是,在我的机器上,当我点击Ctrl-C时,这个runserver脚本不能很好地退出。 我必须手动杀死进程 – 任何人有一个build议来解决这个问题?
感谢Michael Gile的post和django-weave的wiki参考资料。
我会build议使用django-sslserver软件包。
PyPI上的当前包只支持Django版本1.5.5,但补丁已经通过5d4664c提交 。 有了这个修复,系统运行良好,是一个非常简单和直接的testinghttps连接的解决scheme。
更新:因为我张贴我的答案上面的提交已被合并到主分支和一个新的版本已被推送到PyPI。 所以不应该有任何需要为特定修补程序指定5d4664c提交。
与django-sslserver相似,您可以使用django-extensions中的 RunServerPlus
它依赖于Werkzeug(所以你可以访问优秀的Werkzeugdebugging器)和pyOpenSSL(只需要ssl模式)才能安装run:
pip install django-extensions Werkzeug pyOpenSSL
将它添加到项目settings.py文件中的INSTALLED_APPS:
INSTALLED_APPS = ( ... 'django_extensions', ... )
然后你可以用ssl模式运行服务器:
./manage.py runserver_plus --cert /tmp/cert
这将在/tmp/cert.crt
创build一个证书文件,在/tmp/cert.crt
创build一个密钥文件,然后可以在将来的会话中重用。
django扩展中包含了一些额外的东西,你可能会发现它的使用,所以值得快速浏览文档。
注册到https://ngrok.com/ 。 你可以使用https来testing。 这可能会帮助那些只想快速testinghttps的人。
对于那些寻找stunnel选项的前台版本进行debugging:
stunnel.pem是埃文·格林(Evan Grimm)顶级投票答案中生成的证书。
监听端口443上的所有本地接口,并转发到本地主机上的端口80
sudo stunnel -f -p stunnel.pem -P ~/stunnel.pid -r localhost:80 -d 443
只有在1024以下的传入端口(-d [host:]端口)才需要sudo
它可以与socat完成一行:
socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000
,其中8443是侦听传入HTTPS连接的端口,server.pem是自签名服务器证书,localhost:8000是像往常一样启动的debuggingHTTP服务器。
更多详情: http : //www.dest-unreach.org/socat/doc/socat-openssltunnel.html