HTTP 与 HTTPS 有什么区别?聊聊 TLS 握手那些事
浏览器地址栏那把小锁图标,大概是普通用户唯一会主动关心的”安全指标”了。它代表的就是当前连接用的是 HTTPS 而不是 HTTP。这两个协议名字只差一个字母,但背后的差距不小,这篇文章尝试把这中间的区别讲明白。
HTTP 本身是明文的
HTTP(HyperText Transfer Protocol,超文本传输协议)设计之初就没考虑加密这件事,它的任务很单纯:客户端发一个请求,服务器给一个响应,双方按照约定好的格式交换数据。问题在于,这些数据在网络上是以明文形式传输的。
这意味着,只要有人能”看到”你的流量——比如同一个公共 Wi-Fi 下的其他设备、链路上的运营商设备,理论上都能读到你和网站之间传输的完整内容,包括你输入的账号密码、浏览的具体页面。这在今天看来是不可接受的,但在 HTTP 刚被设计出来的年代,互联网还没发展到今天这种承载敏感信息的规模,安全性并不是第一优先级。
HTTPS 做的事:在 HTTP 外面套一层加密
HTTPS 并不是一个全新发明的协议,它本质上是 HTTP 跑在 TLS(Transport Layer Security,传输层安全协议)之上。可以理解成,先用 TLS 建立一条加密的安全通道,等通道建好之后,HTTP 请求和响应照旧在这条通道里传输,只是外部再也看不懂里面具体传的是什么内容了。
TLS 的前身叫 SSL(Secure Sockets Layer),现在 SSL 已经被认为不安全,全面被 TLS 取代,但很多场合出于历史习惯还是会把两者混着叫,比如”SSL 证书”其实说的是 TLS 证书。
一个常见的误解是,用了 HTTPS 网站内容就绝对安全。其实 HTTPS 只保证数据在传输链路上不会被窃听或篡改,网站本身有没有漏洞、服务器有没有被入侵,是完全独立的另一回事。
TLS 握手大致在做什么
建立一条 TLS 连接需要客户端和服务器先”握手”,确认加密方式并交换必要的密钥信息。以目前主流的 TLS 1.3 为例,流程比早期版本精简了不少,大致可以理解成这几步:
- 客户端问好(ClientHello):浏览器发起连接,告诉服务器自己支持哪些加密算法、想访问的域名(通过 SNI 字段)等信息。
- 服务器回应(ServerHello):服务器从客户端支持的算法里选一个双方都能接受的,同时把自己的数字证书发过去。
- 证书验证:浏览器检查这张证书是不是由受信任的机构签发、有没有过期、域名对不对得上。这一步通不过,就是常见的”您的连接不是私密连接”警告的由来。
- 密钥交换:双方通过非对称加密的方式协商出一个只有彼此知道的对称密钥,这一步用的常见算法叫 ECDHE(椭圆曲线密钥交换)。
- 切换到对称加密通信:密钥协商完成后,后续实际传输的数据改用对称加密算法(比如 AES),因为对称加密的计算开销远小于非对称加密,适合大量数据的持续传输。
TLS 1.3 相比 1.2 最大的改进之一,就是把原来需要两个往返(2-RTT)才能完成的握手压缩到了一个往返(1-RTT),甚至在满足条件的情况下支持 0-RTT,这直接体现在网页打开速度上。
证书为什么能建立信任
证书的作用是证明”这台服务器确实是它自称的那个域名”,防止有人伪装成目标网站进行中间人攻击。这套信任体系依赖的是一条”证书链”:
根证书(预装在操作系统 / 浏览器里)
└── 中间证书(由根证书签发)
└── 服务器证书(由中间证书签发,绑定具体域名)
浏览器和操作系统内置了一份受信任的根证书列表,只要一张证书能顺着链条追溯到这份列表里的某个根证书,就认为它是可信的。这也是为什么自己用工具生成的”自签名证书”会被浏览器警告——因为它没有任何一个受信任的根证书为它背书。
证书按验证强度大致分三档,从低到高:
- DV(域名验证):只验证你确实控制这个域名,申请和签发都可以自动化完成,目前互联网上大多数 HTTPS 证书都是这一档
- OV(组织验证):额外验证申请方的组织身份
- EV(扩展验证):验证流程最严格,早年浏览器会在地址栏直接显示公司名称,不过现在大部分浏览器已经弱化了这种视觉区分
对于个人网站或者博客,DV 证书完全够用,而且现在有免费的自动化证书服务,申请和续期都不需要人工介入。
HTTPS 是不是一定更慢
早年确实存在”HTTPS 更慢”的说法,原因是握手和加密解密都需要额外的计算和网络往返。但放到今天,这个说法基本已经过时:
- TLS 1.3 把握手压缩到了 1-RTT,额外开销大幅降低
- 现代 CPU 普遍有硬件级别的加密指令集加速,对称加密的性能损耗几乎可以忽略
- HTTP/2、HTTP/3 这些新版本的应用层协议,实际上是构建在 HTTPS 之上的,反而能带来连接复用、头部压缩等性能提升,综合下来往往比纯 HTTP/1.1 更快
所以现在几乎不存在”为了性能放弃 HTTPS”这个说法成立的场景。
小结
HTTP 负责定义”请求和响应长什么样”,TLS 负责”这条通信链路本身是不是安全的”,HTTPS 是两者的结合。理解这一层关系之后,再看到地址栏那把小锁,大概就知道它具体在替你做什么了:验证了对方身份,加密了传输内容,仅此而已——至于网站本身靠不靠谱,还是得靠别的方式判断。