在 Django/Flask 开发服务器上使用 HTTPS
使用Django或Flask这种框架开发webapp的时候一般都会用内建服务器开发和调试程序,等程序完成后再移交到生产环境部署。问题是这些内建服务器通常都不支持HTTPS,我们想在开发的时候就能够使用和测试HTTPS,不想还没测试就部署到生产环境,所以我们需要内建服务器能支持HTTPS.
这个问题可以通过一个外部程序stunnel来解决,stunnel的作用是通过OpenSSL库对TCP会话进行加密,建立起一个安全通道,保护没有加密功能或未加密的程序。其主要功能有两个:
接收未加密的数据流,进行SSL加密,然后把加密后的数据流通过网络发送出去;
对已加密的数据流进行解密,并将解密后的数据流其通过网络发送给另一个程序。
了解了stunnel的功能后我们很容易就能想到利用stunnel建立一个SSL加密通道绑定到Django/Flask内建服务器上,stunnel启动443端口接受用户的HTTPS请求,解密后发送给内建服务器的8000端口处理,内建服务器处理完后发送数据给stunnel然后加密后返回给浏览器用户。
好吧,上面说了一堆貌似很复杂,其实使用stunnel很简单。
在Django/Flask开发服务器所在的服务器上安装stunnel:
#yuminstallstunnel(在CentOS上)
或者
$sudoapt-getinstallstunnel4(在Ubuntu上)
如果没有购买SSL证书的话自己生成一个,对了,这个文件的权限必须是600哦:
#opensslreq-new-x509-days365-nodes-outvpsee.pem-keyoutvpsee.pem #chmod600vpsee.pem
新建一个配置文件叫做https,然后用stunnel执行这个配置文件,启动443端口连接到Django/Flask内建服务器的8000端口:
#vihttps pid= cert=vpsee.pem debug=7 foreground=yes [https] accept=443 connect=8000 #stunnelhttps
启动Django内建服务器绑定到上面配置文件提到的8000端口:
#HTTPS=1pythonmanage.pyrunserver0.0.0.0:8000
启动Flask内建服务器不需要特别的,改变端口到8000,按照正常的方式启动就可以了:
#virun.py #!flask/bin/python fromappimportapp app.run(host='0.0.0.0',port=8000,debug=True) #./run.py *Runningonhttp://0.0.0.0:8000/ *Restartingwithreloader