HTTP 与 HTTPS 协议比较
| 协议 | http | https |
|---|---|---|
| 名称 | HyperText Transfer Protocol | Hyper Text Transfer Protocol over Secure Socket Layer |
| CA证书 | 不需要 | 需要申请 |
| 加密 | 只能对报文主体 body 进行加密 | 对请求和响应报文进行加密 |
| 安全性 | 无法避免中间人攻击 | 可以阻止中间人攻击 |
| 自底向上层级结构 | IP->TCP->HTTP | IP->TCP->SSL/TLS->HTTPS |
HTTP 过程
| 客户端 | 内容 | 方向 | 服务端 |
|---|---|---|---|
| 三次握手 | SYN | -> | |
| 三次握手 | SYN_ACK | <- | |
| 三次握手 | ACK | -> | |
| ...http 请求与响应... | |||
| 四次挥手 | FIN | ->(<-) | |
| 四次挥手 | ACK | <-(->) | |
| 四次挥手 | FIN_ACK | <-(->) | |
| 四次挥手 | ACK | ->(<-) |
HTTP 报文格式
- 请求报文
| 名称 | 内容 | 简写 |
|---|---|---|
| 请求行 | Function/URL/Version | FUV |
| 首部行 | key-value | KV |
| 主体 | Body |
- 响应报文
| 名称 | 内容 | 简写 |
|---|---|---|
| 响应行 | Version/StatusCode/Phrase | VSP |
| 首部行 | key-value | KV |
| 主体 | Body |
SSL连接证书验证内容
- 验证数字摘要与解密后的内容是否一致
- 验证证书链上的根证书是否在操作系统或浏览器的可信任证书列表内
HTTPS 过程
| 客户端 | 内容 | 方向 | 服务端 |
|---|---|---|---|
| 随机数1,可支持加密算法 | -> | ||
| 随机数2,匹配的加密算法 | <- | ||
| 服务证书 | <- | ||
| 验证证书 | |||
| 组装会话密钥(随机数1,随机数2,预主密钥) | |||
| 通过公钥加密预主密钥 | 传递预主密钥 | -> | |
| 通过私钥解密预主密钥,获得(随机数1,随机数2,预主密钥) | |||
| 组装会话密钥(与客户端一致) | |||
| 会话密钥加密握手消息 | 发送握手消息 | -> | |
| 发送握手消息 | <- | 加密握手消息 |
加密解密
| 名称 | 代表示例 | 特性 |
|---|---|---|
| 对称加密 | AES、DES | 加密与解密密钥相同、高效 |
| 非对称加密 | RSA | 加密与解密密钥不同、耗性能 |