图解http与https请求

2020-11-22 19:30 Python面面观

http 与 https 介绍

超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息,HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP 协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS,为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL/TLS 协议,SSL/TLS 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS 协议是由 SSL/TLS + HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全。

HTTPS 协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

http/https 协议所在的网络层级

http/https 在五大网络网络分层属于应用层的协议,简单的说,后续的应用层的 TCP 协议是根据应用层协议的数据进行在包装继续向下一层网络架构进行转发。

HTTP 对 TCP 连接的使用,分为两种方式:俗称“短连接”和“长连接”(“长连接(Keep-Alive)”又称“持久连接(Persistent Connection)”)。

在了解短连接和长连接之前,先看一下当发送一个请求时候 TCP 的连接情况(三次握手和四次挥手):

上图简单描述了 TCP 一次连接过程中三次握手和四次挥手的情况。

对于短连接来说,加入我们请求一个网页,包含 HTML 文档、图片资源、多媒体资源等。需要经过以下的过程。

而对于长连接,过程如下图所示:

可以发现,短连接的过程每次对资源的请求都会进行 TCP 的连接与释放。很明显这样做是很浪费资源的。所以相对来讲长连接可以复用网络请求资源,减少资源的浪费。

http 的缺点

  1. 使用明文传输,数据可能会被窃听。即 HTTP 协议本身不具备加密的功能,HTTP 协议报文是使用明文进行发送。而通信内容在所有的通信线路上都有可能遭到窥视,比如使用抓包工具获取 HTTP 协议的请求和相应的内容。

  2. 不对对方的身份进行验证,可能出现伪装身份。不存在确认通信方的处理步骤,只要不是限制访问的 ip ,任何客户端都可以访问。这样就会造成一些问题。比如:客户端无法确认返回的资源是真实服务器返回,还是伪装的服务器返回;服务器无法确认客户端是否是真实的客户端,如果请求的是个人隐私信息,伪装的客户端拿到就造成了隐私数据泄漏;无意义的请求全部发送到服务器,即可以对服务器进行攻击。

  3. 无法验证数据的完整性,数据可能遭到篡改。即数据被窃听,可能遭到中间人的更改。

https 的诞生

为了解决 HTTP 协议的以上缺点,在上世纪 90 年代中期,由网景(NetScape)公司设计了 SSL 协议。SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。(顺便插一句,网景公司不光发明了 SSL,还发明了很多 Web 的基础设施——比如“CSS 样式表”和“JS 脚本”)。

到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。

很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段。

通常,HTTP 直接和 TCP 进行通信。当使用 SSL 时候,则演变成先和 SSL 通信,再由 SSL 和 TCP 进行通信。简而言之,所谓 HTTPS,其实就是身披 SSL 这层协议外壳的 HTTP。

在采用 SSL 之后,HTTP 就拥有了 HTTPS 的加密,证书和完整性保护的功能。“对称加密” 和 “非对称加密”

在了解 SSL 之前,先了解下加密方法。

对称加密和非对称加密

明文传输消息

“加密”和“解密”

通俗而言,可以把“加密”和“解密”理解为某种【互逆的】数学运算。就好比“加法和减法”互为逆运算、“乘法和除法”互为逆运算。

“加密”的过程,就是把“明文”变成“密文”的过程;反之,“解密”的过程,就是把“密文”变为“明文”。在这两个过程中,都需要一个关键的东西——叫做“密钥”——来参与数学运算。

“对称加密”

所谓的“对称加密技术”,意思就是说:“加密”和“解密”使用「相同的」密钥。就比如你用 WinRAR 创建一个带密码(口令)的加密压缩包。当你下次要把这个压缩文件解开的时候,你需要输入「同样的」密码。在这个例子中,密码/口令就如同刚才说的“密钥”。

但是,这个加密的密钥该怎么传输呢?

如果密钥可以安全地传输,那么消息应该也可以安全传输。就没必要使用密钥了。

“非对称加密”

所谓的“非对称加密技术”,意思就是说:“加密”和“解密”使用「不同的」密钥。非对称加密技术可能依然存在信息被劫持的情况:

那么,如何保证数据正确性呢,客户端如何确认收到的公钥是真实服务器返回的,不是中间人伪造的?

CA证书

CA 是 PKI 系统中通信双方信任的实体,被称为可信第三方(Trusted Third Party,简称TTP)。 CA 证书,顾名思义,就是 CA 颁发的证书。

CA 的初始是为了解决上面非对称加密被劫持的情况,服务器申请 CA 证书时将服务器的“公钥”提供给 CA,CA 使用自己的“私钥”将“服务器的公钥”加密后(即:CA 证书)返回给服务器,服务器再将“CA 证书”提供给客户端。一般系统或者浏览器会内置 CA 的根证书(公钥)。

HTTPS 中 CA 证书的获取:

HTTPS 请求过程的主要流程如下:

  1. client 向 server 发送请求,然后连接到 server 的 443 端口,客户端支持的加密算法;

  2. server 给 client 发送响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容;

  3. 客户端解析证书,这部分工作是由客户端的 SSL 来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值;

  4. 客户端认证证书通过之后,接下来是通过生成随机值组装会话秘钥。然后通过证书的公钥加密会话秘钥;

  5. 服务端通过私钥解密得到随机值,然后随机值组装会话秘钥,跟客户端会话秘钥相同;

  6. 客户端收到响应使用公钥解密获取到随机值;

  7. 如果客户端能够正常接受的话表明SSL层连接建立完成了,后续则使用随机值进行对称加密过程。

问题说明 :

  1. 怎么保证服务器给客户端下发的公钥是真正的公钥,而不是中间人伪造的公钥呢?可以看到如果公钥被替换掉了,客户端的证书对收到的证书验证过程会不通过;

  2. 证书如何安全传输,被掉包了怎么办?数字证书内容包括了加密后服务器的公钥、权威机构的信息、服务器域名,还有经过 CA 私钥签名之后的证书内容(经过先通过 Hash 函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。

另外还有验证证书安全性过程。

  1. 当客户端收到这个证书之后,使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名,数字签名经过CA公钥解密得到证书信息摘要;

  2. 然后证书签名的方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。因为中间人虽然有权威机构的公钥,能够解析证书内容并篡改,但是篡改完成之后中间人需要将证书重新加密,但是中间人没有权威机构的私钥,无法加密,强行加密只会导致客户端无法解密,如果中间人强行乱修改证书,就会导致证书内容和证书签名不匹配。

总结 http 和 https 的主要区别

  1. https 协议需要到CA申请证书,一般免费证书较少,因而需要一定费用;

  2. http 是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议;

  3. http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;

  4. http 的连接很简单,是无状态的;HTTPS 协议是由 SSL/TLS + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。


本文章转载自公众号:gh_cb58a6829095

首页 - Python 相关的更多文章: