为什么 HTTPS 是安全的?

155 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

中间人攻击(Man In The Middle Attack)

攻击者向浏览器和服务器分别建立独立的连接,使浏览器和服务器认为它们正在进行私密的连接,但实际位于连接中间的攻击者可以窥探或篡改数据,但是浏览器和服务器彼此都不知道。

攻击方式:

  • 域名污染:广域网, DNS 解析时的某个链点返回错误的 IP 地址
  • APR欺骗:局域网,路由器广播时,错误的 IP 进行了响应,告知路由器它的物理地址

HTTPS 是应对中间人攻击的唯一方式。

简单理解:服务器发送证书给浏览器,浏览器确认证书正确,并检查证书中对应的主机名是否正确,如果正确则双方加密数据后发给对方,对方再进行解密,保证数据不透明。

HTTPS = HTTP + TLS

  • 应用层的 HTTP 负责数据传输
  • 传输层的 TLS 负责加密(SSL 是 TLS 的前身,SSL 废弃后,才有了 TLS)

证书

证书:控制台的 Security 面板中可以查看整个证书的完整内容。

证书可以被克隆吗?这是无意义的,浏览器和服务器双方使用 RSA (非对称加密算法)交换公钥,使用的公钥和密钥是一一配对的,所以即使证书被克隆,也无法解密数据。

HTTPS连接过程(抓包分析)

客户端发送 Client Hello 给服务端,包含信息:

  • TLS(传输层安全性协议)版本
  • 客户端当前的时间(秒数)
  • 随机密码串
  • Session ID(会话 ID):第一次连接时为 0,如果有则可以恢复会话,不用重复握手。服务端提供 Session ID,刷新页面时,客户端会带上。
  • 浏览器支持的加密组合方式
  • 域名:在传输层将域名信息(HTTP 应用层工作)告知服务器,以便服务器根据域名发送相应的证书。

服务器收到 Client Hello 的信息后,向浏览器发送 Server Hello 的包,包含信息:

  • 时间
  • 随机数
  • Session ID
  • 服务器选中的加密方式

发送证书

服务器接着发送一个证书的包给客户端,包含多个证书,证书之间相互依赖、担保,形成一条依赖链。

证书内容包括:签名、签名算法、签名哈希算法、有效期、公钥、公钥参数

RSA 加密和解密

浏览器会验证证书是合法的

密钥交换

Server Key Exchange 和 Client Key Change

剩余流程

  • 浏览器发送 Change Cipher Spec 给服务器,告知服务器可以开始传输数据
  • 服务器发送 Change Cipher Spec 给浏览器
  • 浏览器回复 ACK 给服务器,就开始传输数据

HTTPS 的使用代价:

  • 建立 HTTPS 需要时间(~0.3s)
  • 数据加密和解密会占用 CPU
  • 数据加密后比原信息大,占用更多带宽

SSLStrip 攻击

专门针对 HTTPS 的攻击方式

  1. 攻击者通过 ARP 欺骗监听客户端
  2. 攻击者与浏览器建立 HTTP 连接
  3. 攻击者与服务器建立 HTTPS 连接