侧边栏壁纸
  • 累计撰写 247 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

更安全的 HTTP —— HTTPS(上):理论基础篇

kaixindeken
2021-04-23 / 0 评论 / 0 点赞 / 104 阅读 / 2,257 字

HTTP的缺点

HTTP 协议设计的初衷就是简单方便,但是随着 Web 的发展和交互的复杂,也引入了一些安全性问题:

  • 通信使用明文,内容可能会被窃听:HTTP 协议本身不具备加密功能,所以无法对通信整体(请求和响应的内容)进行加密,即 HTTP 报文使用明文方式发送。按照 TCP/IP 协议族的工作机制,通信内容在所有线路上都有可能被窃听。
  • 不验证通信方的身份,因此有可能遭遇伪装:HTTP 协议中的请求和响应不会对通信方进行确认,所以任何人都可以发起请求,另外,服务器只要接收到请求,不管对方是谁都会返回一个响应,即使是伪装的客户端。另外,即使是无意义的请求也会处理,无法阻止海量请求下的 DoS 攻击。
  • 无法证明报文的完整性,所以有可能已遭篡改:没有任何办法确认发出的请求/响应和接收到的请求/响应是前后相同的,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Main-in-the-Middle attack,MITM)。

针对 HTTP 协议的以上问题,想必你已经知道了目前的解决方案,那就是使用 HTTPS 协议来传输内容,HTTPS 的英文全名是 HTTP Secure 或 HTTP over SSL,即基于 SSL 的安全 HTTP 协议。SSL 会建立一个安全的通信线路,在此线路上传输的内容都会经过加密处理,此外 SSL 还通过证书的方式来确认通信双方的身份,这样就可以从源头上杜绝了通信方被伪装以及信息被窃听和篡改的可能性,从而确保 HTTP 通信的安全。

HTTPS 简介

HTTPS 协议并非是应用层的一种新协议,只是将 HTTP 通信接口部分用 SSL 协议代替。通常,HTTP 会直接和 TCP 通信,当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信。所以,所谓的 HTTPS,就是身披 SSL 协议外壳的 HTTP 而已,以下是普通的 HTTP 通信和 HTTPS 通信的架构对比图:

1.png

采用 SSL 后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护等功能。

SSL 是独立于 HTTP 的协议,所以不光是 HTTP 协议,其它运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL 协议使用。可以说 SSL 是当今世界上应用最为广泛的网络安全技术。

在具体介绍 HTTPS 的底层工作原理之前,我们有必要先介绍几个 Web 安全相关的术语。

对称加密

在对称加密算法中,加密和解密使用的密钥是相同的。在互联网上转发密钥,如果通信被监听那么密钥就会落入攻击者之手,存在安全隐患,另外还得设法安全地保管接收到的密钥。

非对称加密

在非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。一把是作为公开的公钥,另一把是作为谁都不能给的私钥。公钥加密的信息,只有私钥才能解密;私钥加密的信息,只有公钥才能解密。

使用这种加密方式,发送密文的一方使用公钥进行加密,对方收到加密信息后,使用私钥进行解密。利用这种方式,不需要发送用来解密的私钥,也不必担心密钥被攻击者窃听而盗走,故而安全性更高,但与对称加密相比,算法和实现更加复杂,处理速度更慢。

HTTPS 充分两种加密方式的优势,在交换密钥环节使用非对称加密,之后的建立通信交换报文阶段则使用对称加密。

数字证书

通过 OpenSSL 提供的命令就可以生成私钥和公钥,但是需要权威机构颁发证书(Certificate)才能被承认,否则我们无法判断通信中传递的公钥是否是目标服务器返回的。

生成证书需要发起一个证书请求,然后将这个请求发给一个权威机构(客户端和服务端都信任的第三方结构)去认证,这个权威机构我们称之为 CA(Certificate Authority)。权威机构会给证书敲一个章,也就是所谓的签名算法。

签名算法大概是这样工作的:一般是对信息做一个 Hash 计算,得到一个 Hash 值,这个过程是不可逆的,也就是说无法通过 Hash 值得出原来的信息内容。在把信息发送出去时,把这个 Hash 值通过 CA 的私钥加密后,作为一个签名和信息一起发出去。

CA 用自己的私钥给网站的公钥签名,就相当于给网站背书,形成了网站的证书。

CA 的公钥需要更牛的 CA 给它签名,形成 CA 的证书,要想看 CA 的证书是否可靠,要看 CA 的上级证书的公钥,能不能解开这个 CA 的签名。这样层层上去,直到全球皆知的几个著名大 CA,称为 root CA,做最后的背书。通过这种层层授信背书的方式,从而保证了非对称加密模式的正常运转。

服务器会将这份 CA 颁发的公钥证书(也可以叫做数字证书)发送给客户端,以进行非对称加密方式通信。

接到证书的客户端可使用 CA 提供的公钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:

  • 认证服务器公钥的是真实有效的数字证书认证机构;
  • 服务器的公钥是值得信赖的。

此处 CA 的公钥必须安全转交给客户端,如何安全转交是件很困难的事,因此,大多数浏览器开发商发布版本时,会事先在内部植入常见 CA 的公钥。

0

评论区