我有一个使用“安全” Cookie的应用程序,想要测试其功能而无需设置复杂的启用SSL的开发服务器。有什么办法可以做到这一点,就像我可以使用来测试未加密的请求一样简单./manage.py runserver
?
我有一个使用“安全” Cookie的应用程序,想要测试其功能而无需设置复杂的启用SSL的开发服务器。有什么办法可以做到这一点,就像我可以使用来测试未加密的请求一样简单./manage.py runserver
?
Answers:
它不像内置的开发服务器那么简单,但是使用stunnel作为浏览器和开发服务器之间的SSLified中间人来达成某种目标并非难事。使用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
让我们逐行将其分解:
使我们刚刚创建的runscript文件可执行:
chmod a+x runserver
现在,当您要运行开发服务器时,只需./runserver
从项目目录执行即可。要进行尝试,只需将浏览器指向http:// localhost:8000(用于正常的HTTP流量)和https:// localhost:8443(用于HTTPS流量)。请注意,您使用的浏览器几乎肯定会抱怨所使用的证书,并要求您添加例外或以其他方式明确指示浏览器继续浏览。这是因为您创建了自己的证书,但浏览器不信任该证书来告知真实身份。这对于开发来说很好,但是显然不会削减它的生产量。
不幸的是,在我的机器上,当我按下Ctrl-C时,此runserver脚本无法很好地退出。我必须手动终止进程-有人建议解决该问题吗?
request.is_secure()
将报告True
。如果不需要,那是对的-您可以将stunnel指向单个实例。
"sslVersion = SSLv3": SSLv3 not supported
。
stunnel_pid=$1
不是为我工作,但为我工作stunnel_pid=$!
。如何stunnel_pid=$1
为您工作?
我建议使用django-sslserver软件包。
PyPI上的当前软件包最多仅支持Django 1.5.5版,但已通过5d4664c提交了补丁。通过此修复程序,系统可以很好地运行,并且是用于测试https连接的非常简单明了的解决方案。
更新:自从我发布答案以来,以上提交已合并到master分支中,并且新版本已推送到PyPI。因此,不需要为该特定修复指定5d4664c提交。
类似Django的sslserver你可以使用RunServerPlus从Django的扩展
它依赖于Werkzeug(因此您可以访问出色的Werkzeug调试器)和pyOpenSSL(仅ssl模式需要),因此可以运行:
pip install django-extensions Werkzeug pyOpenSSL
将其添加到您的项目settings.py文件中的INSTALLED_APPS中:
INSTALLED_APPS = (
...
'django_extensions',
...
)
然后,您可以使用以下命令以ssl模式运行服务器:
./manage.py runserver_plus --cert /tmp/cert
这将在处创建一个cert文件/tmp/cert.crt
和一个密钥文件,/tmp/cert.key
然后可以将其重新用于以后的会话。
django扩展中包含很多额外的东西,您可能会发现它们的使用,因此值得快速浏览一下文档。
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
只需安装
sudo pip install django-sslserver
在已安装的aps中包括sslserver
INSTALLED_APPS = (...
"sslserver",
...
)
现在您可以运行
python manage.py runsslserver 0.0.0.0:8888
注册到https://ngrok.com/。您可以使用https进行测试。这可能对只想快速测试https的人有所帮助。
在终端上发出以下命令
ngrok http 8000
它将开始ngrok会话。它将列出两个URL。一个映射到http:// localhost:8000。第二个映射到https:// localhost:8000。请检查以下屏幕截图。使用任一网址。它将映射到您的本地服务器。
allowed_host
可以用socat一行完成:
socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000
,其中8443是用于侦听传入HTTPS连接的端口,server.pem是自签名服务器证书,而localhost:8000是照常启动的调试HTTP服务器。
更多详细信息:http : //www.dest-unreach.org/socat/doc/socat-openssltunnel.html
使用Nginx之类的代理而不是Django处理SSL / TLS。可以将Nginx设置为侦听端口443,然后将请求转发到Django开发服务器(通常为http://127.0.0.1:8000
)。Nginx的配置可能如下所示:
server {
listen 443 ssl;
server_name django-dev.localhost;
ssl_certificate /etc/ssl/certs/nginx_chain.pem;
ssl_certificate_key /etc/ssl/private/nginx.pem;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
}
}
您还需要映射django-dev.localhost
到127.0.0.1
并添加django-dev.localhost
到ALLOWED_HOSTS
中settings.py
。在Linux上,您需要将以下行添加到/etc/hosts
:
127.0.0.1 django-dev.localhost
然后,您可以通过https://django-dev.localhost
在浏览器中进入来访问您的开发人员站点(您将需要绕过浏览器的安全警告)。