HTTPS协议
HTTPS(Hypertext Transfer Protocol Secure)是在 HTTP 的基础上加入 SSL/TLS 协议层,对传输内容进行加密的安全版本。它由 HTTP 协议(应用层)+ SSL/TLS 协议(传输层与应用层之间)+ TCP 协议 组成。
为什么需要 HTTPS
HTTP 协议以明文方式传输内容,不提供任何数据加密,存在三大风险:
- 窃听风险:第三方可以截获通信内容
- 篡改风险:第三方可以篡改通信内容(如运营商劫持插入广告)
- 冒充风险:第三方可以冒充他人身份参与通信(中间人攻击)
HTTPS 通过加密、身份认证与完整性校验解决了以上三个问题。
加密方式
- 对称加密:加密和解密使用同一个密钥,速度快,但密钥分发存在安全隐患(如何安全地把密钥传给对方)。
- 非对称加密:拥有公钥(public key)和私钥(private key)两个密钥,公钥加密的内容只能用私钥解密。安全性高,但运算速度慢,不适合加密大量数据。
HTTPS 采用的是混合加密方案:利用非对称加密安全地交换对称密钥,再用对称加密来加密实际传输的数据,兼顾了安全性和性能。
数字证书与 CA
仅有加密还不能解决冒充问题——如果中间人在密钥交换阶段替换了公钥,仍然可以伪装成服务器。因此需要数字证书来证明公钥的身份:
- 网站向证书颁发机构(CA,Certificate Authority)申请证书。
- CA 使用自己的私钥对网站的公钥等信息进行签名,生成数字证书。
- 浏览器内置了受信任的 CA 根证书列表,收到证书后用 CA 的公钥验证签名,从而确认证书(以及其中的服务器公钥)是可信的,没有被篡改。
TLS 握手过程(简化版)
- Client Hello:客户端发送支持的 TLS 版本、加密套件列表、一个随机数
client random。 - Server Hello:服务器选择 TLS 版本和加密套件,返回一个随机数
server random,并发送数字证书(含公钥)。 - 证书校验:客户端校验证书链是否可信、域名是否匹配、是否过期。
- 密钥交换:客户端生成
pre-master secret,用服务器公钥加密后发送给服务器;双方分别用client random + server random + pre-master secret计算出相同的对称密钥(会话密钥)。 - 握手完成:双方切换到对称加密,用会话密钥加密后续所有通信内容。
TLS1.3 进一步简化了握手过程(1-RTT,支持 0-RTT),减少了握手带来的延迟。
HTTP 与 HTTPS 的区别
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 安全性 | 明文传输,不安全 | 基于 SSL/TLS 加密传输 |
| 端口 | 80 | 443 |
| 证书 | 不需要 | 需要向 CA 申请证书 |
| 性能 | 无加密开销 | 多一次 TLS 握手,有一定性能损耗(可通过会话复用等方式缓解) |
| SEO/信任 | 浏览器提示"不安全" | 浏览器显示锁形图标,更受信任 |