一、HTTP 和 HTTPS 的区别
HTTP是明文传输的协议,HTTPS是在HTTP和TCP之间加入了SSL/TLS加密层的安全协议。
-
安全性(核心区别)
- HTTP:明文传输,数据易被窃听、篡改、冒充
- HTTPS:通过SSL/TLS加密,保证传输安全
-
连接方式
- HTTP:基于TCP,端口80
- HTTPS:HTTP + SSL/TLS,端口443
-
证书机制
- HTTP:不需要证书
- HTTPS:需要CA颁发的数字证书验证身份
-
性能影响
- HTTP:无加密开销,响应更快
- HTTPS:有加密解密开销,但可通过优化减少影响
-
SEO与浏览器支持
- HTTP:现代浏览器标记为"不安全"
- HTTPS:SEO有优势,浏览器显示安全锁标志
二、HTTP 基础解析
1. HTTP是无状态协议,如何保持状态?
-
Cookie/Session机制
// 实际应用示例 // 1. 客户端首次访问,服务器Set-Cookie // HTTP响应头:Set-Cookie: sessionid=abc123; Path=/ // 2. 客户端后续请求自动携带Cookie // HTTP请求头:Cookie: sessionid=abc123 // 3. 服务器通过sessionid查找对应session数据
2. HTTP各版本区别
| 版本 | 关键特性 | 面试要点 |
|---|---|---|
| HTTP/1.0 | 短连接 | 每次请求建立新TCP连接 |
| HTTP/1.1 | 持久连接、管道化 | 复用TCP连接,但有队头阻塞问题 |
| HTTP/2 | 二进制分帧、多路复用 | 解决队头阻塞,服务器推送 |
| HTTP/3 | 基于QUIC、UDP | 解决TCP队头阻塞,0-RTT连接 |
3. HTTP状态码
// 分类记忆
1xx: 信息性状态码(100 Continue)
2xx: 成功(200 OK, 201 Created, 204 No Content)
3xx: 重定向(301 Moved Permanently, 302 Found, 304 Not Modified)
4xx: 客户端错误(400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found)
5xx: 服务器错误(500 Internal Server Error, 502 Bad Gateway, 504 Gateway Timeout)
4. 常见HTTP头部字段
// 请求头
Authorization: Bearer token123 # 认证
Content-Type: application/json # 数据类型
User-Agent: Mozilla/5.0 # 客户端信息
Accept-Encoding: gzip, deflate # 压缩支持
// 响应头
Cache-Control: max-age=3600 # 缓存控制
Set-Cookie: session=abc # 设置Cookie
Server: nginx/1.18 # 服务器信息
三、HTTPS 基础解析
1. 为什么需要HTTPS?(三大问题)
HTTP的三类安全问题:
1. 窃听风险:通信内容明文传输,易被窃听
2. 篡改风险:中间人可以修改通信内容
3. 冒充风险:无法验证对方身份,可能遭遇钓鱼网站
2. SSL/TLS握手过程详解
标准RSA握手流程(TLS 1.2):
1. 客户端发起ClientHello
- 支持TLS版本
- 支持的加密套件列表
- 客户端随机数
2. 服务器响应ServerHello
- 选定的TLS版本和加密套件
- 服务器随机数
- 发送服务器证书(包含公钥)
3. 客户端验证证书
- 检查证书有效性(颁发机构、有效期、域名匹配)
- 验证证书链的信任关系
4. 客户端生成预主密钥
- 生成随机预主密钥
- 用服务器公钥加密后发送
5. 双方生成会话密钥
- 客户端和服务器使用:客户端随机数 + 服务器随机数 + 预主密钥
- 生成相同的对称加密密钥
6. 完成握手,加密通信
详细图解如下:
graph TD
A[开始TLS握手] --> B[TCP连接建立]
subgraph "握手阶段"
B --> C[1. ClientHello<br>支持的TLS版本<br>客户端随机数<br>加密套件列表]
C --> D[2. ServerHello<br>选择的TLS版本<br>服务器随机数<br>选择的加密套件]
D --> E[3. Certificate<br>服务器证书链]
E --> F[4. ServerHelloDone]
F --> G{客户端验证证书}
G -->|通过| H[5. ClientKeyExchange<br>用服务器公钥加密预主密钥]
G -->|失败| I[握手终止]
H --> J[6. ChangeCipherSpec<br>切换加密方式]
J --> K[7. Finished<br>加密的握手摘要]
K --> L[8. ChangeCipherSpec<br>切换加密方式]
L --> M[9. Finished<br>加密的握手摘要]
end
subgraph "密钥生成"
C1[客户端随机数] --> Z
D1[服务器随机数] --> Z
H1[预主密钥] --> Z
Z[生成主密钥<br>和会话密钥]
end
M --> N[握手完成]
N --> O[应用数据加密传输]
3. 证书验证过程
// 证书链验证示例
浏览器验证证书的步骤:
1. 检查证书是否在有效期
2. 检查证书域名是否匹配
3. 验证证书签名链(从叶证书到根证书)
a. 用根CA的公钥验证中间CA证书
b. 用中间CA的公钥验证服务器证书
4. 检查CRL或OCSP响应,确认证书未被吊销
4. 对称加密 vs 非对称加密
-
对称加密(数据传输):
- 加解密速度快
- 密钥管理困难(需要安全传输密钥)
- 示例:AES、ChaCha20
-
非对称加密(密钥交换):
- 加解密速度慢
- 密钥管理简单(公钥公开,私钥保密)
- 示例:RSA、ECC
四、实际应用场景
1. 什么情况必须用HTTPS?
必须使用HTTPS的场景:
1. 用户登录认证页面
2. 支付交易页面
3. 涉及个人隐私信息(身份证、手机号)
4. 企业内网敏感系统
5. PWA(渐进式Web应用)需要
2. 如何从HTTP迁移到HTTPS?
# 迁移步骤
1. 获取SSL证书(Let's Encrypt免费)
2. 服务器配置HTTPS
3. 设置HTTP到HTTPS的301重定向
4. 更新所有资源的链接为HTTPS
5. 启用HSTS头,强制浏览器使用HTTPS
6. 向搜索引擎提交HTTPS站点
五、常见问题解答
1. HTTPS真的绝对安全吗?
HTTPS不是绝对安全,但能有效解决三大安全问题:
1. 防窃听:加密传输,第三方无法直接读取
2. 防篡改:有完整性校验,修改会被发现
3. 防冒充:CA证书验证服务器身份
但仍然需要注意:
- 客户端可能被恶意软件攻击
- 服务器私钥可能泄露
- 用户可能被钓鱼网站欺骗(证书名称不匹配)
- 加密算法可能被破解(使用弱加密套件)
2. 为什么HTTPS需要非对称加密和对称加密结合?
混合加密的原因:
1. 性能考虑:非对称加密计算量大,不适合大数据量传输
2. 安全性:对称加密的密钥需要通过安全方式传输
解决方案:
- 握手阶段:用非对称加密安全交换对称加密的密钥
- 传输阶段:用对称加密高效加密实际数据
3. 什么是中间人攻击?HTTPS如何防范?
中间人攻击:
攻击者在客户端和服务器之间拦截通信,可以窃听、篡改数据。
HTTPS防范机制:
1. 证书验证:客户端验证服务器证书的真实性
2. 加密通信:即使拦截也无法解密内容
3. 完整性校验:数据被篡改会被发现
但如果用户忽略证书警告,仍然可能受害。
4. 描述一次完整的HTTPS请求过程
1. DNS解析域名
2. TCP三次握手建立连接
3. TLS握手建立安全通道(证书验证、密钥协商)
4. 发送HTTP请求(加密后)
5. 服务器返回HTTP响应(加密后)
6. 浏览器解密并渲染内容
7. TCP四次挥手断开连接
5. HTTPS如何影响网站性能?如何优化?
性能影响:
1. 额外的TLS握手延迟(1-2个RTT)
2. 加解密计算开销(服务器CPU消耗增加10-15%)
3. 证书传输增加带宽消耗
优化措施:
1. 会话恢复减少握手次数
2. TLS 1.3减少到1-RTT甚至0-RTT
3. 硬件加速(AES-NI指令集)
4. 优化证书链,减少传输大小
5. 启用HTTP/2提高传输效率