Skip to content

https协议 ​

元信息 ​

  • 目标:从 HTTP协议"明文传输"的三个具体风险(被偷看、被篡改、被冒充)出发,理解 HTTPS 为什么必须存在;建立"HTTPS = HTTP + TLS"的分层认识,会看浏览器地址栏的小锁和证书
  • 关键概念:HTTPS、TLS、明文传输、加密、证书、CA(证书颁发机构)、中间人攻击、443 端口
  • 关联阶段:cp1
  • 常见误区:以为 HTTPS 是和 HTTP 并列的另一种协议(它就是 HTTP,外面套了一层加密);以为加密只是为了防偷看(防篡改、防冒充同样重要);以为地址栏有小锁的网站就一定可信(小锁只保证传输链路安全,不保证网站本身不是骗子)

HTTP 的三个风险 ​

HTTP 是明文传输的:报文从你的设备到服务器,途经的每一段网络,拿到的都是可读的原文。设想你在咖啡馆连上免费 WiFi,打开一个 http:// 开头的网站,输入密码登录,同一网络里的任何人都能看到这个密码。

具体是三个风险:

  • 被偷看(窃听):报文途经的任何一方,WiFi 路由器、运营商、沿途的路由器,都能读到明文,密码、聊天内容一览无余
  • 被篡改:中途的人不但能看,还能改。改掉页面里的链接、往返回的内容里塞一段广告或恶意脚本,你和服务器都察觉不到
  • 被冒充:你访问 example.com,怎么确定对面真的是它的服务器?HTTP 没有任何核实手段,攻击者可以假扮成你要访问的网站

HTTPS 是什么 ​

HTTPS = HTTP + TLS。TLS(Transport Layer Security,传输层安全协议)是加在 HTTP 下面的一层:HTTP 报文先照常生成,交给 TLS 加密成密文再发出去;对方收到后先解密,再交回给 HTTP 处理。HTTP 本身一个字都不用改,这就是协议与实现分层的好处。

  • 默认端口 443(HTTP 是 80)
  • 网址以 https:// 开头,浏览器显示小锁图标

TLS 怎么解决三个风险 ​

三个风险各有一手:

  • 防窃听,加密:通信内容全部加密成密文,途经的人只能看到乱码。加密用的钥匙(密钥)只存在于你和服务器之间,每次连接时临时协商,用完就换
  • 防篡改,完整性校验:每段数据都附带校验值,中途被改过一个字节,解密时立刻发现并丢弃
  • 防冒充,证书:服务器必须出示由 CA(Certificate Authority,证书颁发机构)签发的证书,证明"我就是这个网站"。CA 的根证书预先内置在你的操作系统和浏览器里,验证在本机完成,不依赖网络里的任何人

连接建立时的简化流程(真实握手细节更多,原理如此):

握手与加密传输交互图:两阶段——先握手(出示证书、本机验证、协商只有彼此知道的密钥),再加密传输(HTTP 报文照常生成,TLS 加密上路,途经者只看到乱码)。

握手完成后才开始传 HTTP 报文,此后全程密文。开头三个风险至此都有了对策。

体验 ​

  • 浏览器打开任意 https:// 网站,点地址栏的小锁,查看证书:能看到颁发者(哪家 CA 签的)、归属域名、有效期
  • 命令行观察握手:
bash
curl -v https://httpbin.org/get 2>&1 | head -20

输出里 TLS handshake 的各行,就是上面流程图的前半段。

  • 对比体验:curl -v http://neverssl.com 没有 TLS 握手,报文直接明文上路

边界 ​

  • 对称/非对称加密的原理、证书链、TLS 各版本差异,属于细节,用到时再查:MDN: HTTPS