←首页

网络基础

HTTPS 如何保护一次访问

浏览器地址栏的小锁背后,是一次握手加一条证书链。

协议TLS 1.3
握手1 个往返
端口443

HTTPS 就是 HTTP 外面套一层 TLS 加密。它解决三件事:别人看不到内容,改不了内容,也冒充不了网站。

冒充靠证书防住:网站出示证书,浏览器顺着证书链一路查到自己信任的根证书。

1. 路上的人能看到什么

同一个请求,走 HTTP 和走 HTTPS,中间经过的网络设备看到的东西完全不同。

路上能看到的HTTPHTTPS
访问的域名能能(握手时的域名字段是明文)
访问的具体页面路径能不能
提交的账号密码能不能
页面内容能,还能篡改不能,篡改会被发现

依据:《MDN:Transport Layer Security》。

2. 握手:一个往返建好加密通道

TLS 1.3 把完整握手压到一个往返。浏览器第一句话就带上密钥交换参数,服务器回一句话就能开始加密传输。

浏览器 网站服务器 ClientHello:支持的算法和密钥交换参数 ServerHello、证书、签名、Finished 从这里起,服务器发的内容已经加密 Finished,然后是加密的 HTTP 请求 一个往返后开始传数据
示意,省略了部分扩展字段。

依据:《RFC 8446:TLS 1.3》第 2 节。

3. 证书:证明对面就是这个网站

加密只保证没人偷听,还要确认对面不是冒牌货。浏览器检查网站证书是不是由它信任的机构签发、域名对不对、有没有过期。

根证书 预装在系统和浏览器里 中间证书 由根证书签名 网站证书 写明域名和有效期 浏览器从右往左逐级验证签名,直到信任的根证书
示意。

免费证书机构会先确认申请人真的控制这个域名,比如要求在域名的 DNS 里放一条指定记录,然后才签发。

依据:《Let's Encrypt:How It Works》。

4. 常见误解

说法实际情况
有小锁的网站就可信小锁只说明连接加密、域名对得上,不代表网站本身靠谱
HTTPS 会明显拖慢网页TLS 1.3 握手只多一个往返,连接复用后几乎感觉不到
HTTPS 能隐藏我访问了哪个网站域名在握手中仍是明文,只有路径和内容被加密

资料链接

资料地址
《RFC 8446:TLS 1.3》https://www.rfc-editor.org/rfc/rfc8446
《MDN:Transport Layer Security》https://developer.mozilla.org/en-US/docs/Web/Security/Transport_Layer_Security
《Let's Encrypt:How It Works》https://letsencrypt.org/how-it-works/