全国咨询/投诉热线:400-618-9090

首页技术文章正文

​如何配置Django+HTTPS开发环境?

更新时间:2019-10-23 来源:黑马程序员 浏览量:


HTTP的弊端及HTTPS的由来

众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种。那么在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数据本身存在的安全问题:(1)通信使用明文(不加密),内容可能被窃听;(2)不验证通信方的身份,因此可能遭遇伪装;(3)无法证明报文的完整行,所以可能被篡改。

为了解决HTTP协议存在的安全性问题,上世纪90年代由网景(NetScape)公司设计了SSL(Secure Sockets Layer)协议——“安全套接层”协议。经过多年发展SSL在互联网上广泛应用,标准化后名称改为TLS(Transport Layer Security)——“传输层安全”协议。

1571821094457_Django+HTTPS01.jpg

所谓的HTTPS即是“HTTP+SSL/TLS”的结合使用而已。解决的是HTTP协议数据传输的安全性问题——在HTTP协议层和TCP传输层之间加入“安全层”,使得应用层数据报经过加密后再传输,保证数据在传输过程中的完整性。

那么,SSL/TLS在数据传输过程中是如何实现加密保证数据完整性的呢?在此,我们需要再进一步探讨该协议的加密逻辑。

加密算法有两种,分别是“对称加密”和“非对称加密”。(本文不对密码学中的加密算法的实现做探讨,仅解释加密原理)。

对称加密

关于“对称加密”,可以理解成一种“互逆”的数学运算(对比单向加密它是一种可逆的加密算法)。也就是说有加密,就可以解密,但是不管是加密还是解密的过程中,必须有一个至关重要的称之为“密钥”的东西参与运算。

1571821161501_Django+HTTPS02.jpg


对称加密最大的特点就在于加密和解密使用“相同的”密钥。那么关键问题来了——客户端和服务器交互使用共同的“密钥”来加密通信,这就需要服务器将密钥传输给客户端,但是如此操作又如何才能够保证密钥在传输过程中的安全性呢?如果密钥在传输过程中遭遇第三方拦截,那就意味着双端通信之于第三方而言和明文通信没有区别了。也就是说对称加密并不适用于密钥需要网络传输的应用场景。

由此,诞生了“非对称加密”。

非对称加密

所谓的“非对称加密”就是加密和解密使用的密钥是不同的,双端通信各自产生公钥和私钥匙,并交换双端的公钥用于通信加密。如下图所示,当服务器把公钥交给客户端,客户端在通信时使用公钥对数据进行加密处理,即使公钥在传输过程中遭遇第三方拦截,由于解密的密钥始终存储在服务端并不会对外公开,所以拦截方仅用一个公钥是无法解密数据的。

但是上述应用场景仍然存在一定的被窃听的风险。也就是说,作为窃听者,在拦截服务器响应给客户端的公钥后,伪造服务端身份,给客户端响应窃听者的公钥。此后客户端使用窃听者的公钥加密数据,窃听者在拦截数据消息后,利用自己的私钥进行解密,得到明文数据后篡改数据,然后在使用服务器公钥加密数据和服务器通信。整个通信的过程中,客户端都无法察觉自己通信的对端到底是窃听者还是服务器。

观察下图中的图示模型,假设通信过程已被窃听。那么问题到底出在哪里?【推荐了解黑马程序员python+人工智能课程

非对称加密中的窃听风险图示
1571821179658_Django+HTTPS04.jpg


我们可以从整个流程的一开始去分析。

客户端在第一次请求公钥,并在响应中得到了来自“对端”的公钥。然后就利用该“公钥”通信。问题就是出在了这个环节——显而易见,作为客户端并没有对该“公钥”的“来源”做验证。换句话说,客户端并不清楚,该“公钥”是否真的来自真正的服务器而不是第三方窃听者。

如此,客户端就必须对“公钥”做验证,确定该公钥确实是来自合法的服务器后,才能够保证双端通信的安全性。

CA认证机制

这里需要引入第三方机构: 证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,作为电子商务交易中受信任的第三方,承担公钥体系中公钥合法性检验的责任。

CA中心会为每个使用公钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户公钥的合法性。CA机构的数字签名使得攻击者无法伪造和篡改证书。换句话说,证书无法篡改,只要证书是有效且合法的,那么证书中的公钥就是有效且合法的!

服务器将公钥提供给CA机构,CA机构使用自己的私钥将服务器公钥加密后将CA证书(该证书保存有服务器公钥)返回给服务器。一般操作系统或者浏览器中都会内置CA根证书。当客户端(比如浏览器)请求服务器时,服务器会将CA证书提供给客户端,客户端获取到CA证书后会使用CA根证书进行本地验证(验证通过即表明服务器CA证书的合法性,间接表明公钥来源的合法性)。


自签证书实现django+http+ssl

由于正规的证书需要向CA机构申请,在此,我通过自签证书的形式简单配置一个基于https通信的django服务器。

(1)创建签发CA根证书的配置文件MyCompanyCA.cnf

1571821247938_Django+HTTPS05.jpg


(2)创建拓展配置文件(用于创建服务器CA证书)MyCompanyLocalhost.ext

1571821254474_Django+HTTPS06.jpg

(3)创建CA证书及密钥(需要使用openssl,可以通过包管理工具安装)

1571821261138_Django+HTTPS07.jpg

(4)创建ssl证书密钥及申请文件

1571821309129_Django+HTTPS08.jpg

(5)签发ssl证书

1571821334333_Django+HTTPS09.jpg

经过上述步骤,通过openssl实现自签发证书,其中MyCompanyCA。cer为CA根证书(由于我们这是自签发,系统或浏览器中并不会内置该根证书,需要我们手动添加)。ssl证书文件为MyCompanyLocalhost。cer,ssl证书密钥文件为MyCompanyLocalhost.pvk。

Django启动HTTPS测试服务器

(1)安装依赖项

1571821366141_Django+HTTPS10.jpg

(2)修改Django配置文件

1571821373180_Django+HTTPS11.jpg

(3)启动django的https服务

1571821380867_Django+HTTPS12.jpg

自此django已启动https服务,但使用浏览器仍然无法使用https访问(服务器证书不可信)。

1571821407904_Django+HTTPS13.jpg

需要将自签发的CA根证书安装到需要使用https访问的客户端中。以下为macos系统中添加证书的操作图示(windows中也有相关界面操作):

(1)添加根证书

1571821416466_Django+HTTPS14.jpg

(2)设置系统信任该证书

1571821423569_Django+HTTPS15.jpg

自此,客户端一方(浏览器)添加完成后,就可以使用https访问服务器。

1571821429149_Django+HTTPS16.jpg

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

http://www.itcast.cn/subject/uizly/index.shtml?seozxuids

14天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

8天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

0天免费试学

基础班入门课程限时免费

申请试学名额

12天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

10天免费试学

基础班入门课程限时免费

申请试学名额
在线咨询 我要报名