Appearance
https协议
HTTP 的三个风险
HTTP 是明文传输的:报文从你的设备到服务器,途经的每一段网络,拿到的都是可读的原文。设想你在咖啡馆连上免费 WiFi,打开一个 http:// 开头的网站,输入密码登录,同一网络里的任何人都能看到这个密码。
具体是三个风险:
- 被偷看(窃听):报文途经的任何一方,WiFi 路由器、运营商、沿途的路由器,都能读到明文,密码、聊天内容一览无余
- 被篡改:中途的人不但能看,还能改。改掉页面里的链接、往返回的内容里塞一段广告或恶意脚本,你和服务器都察觉不到
- 被冒充:你访问 example.com,怎么确定对面真的是它的服务器?HTTP 没有任何核实手段,攻击者可以假扮成你要访问的网站
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