HTTP/HTTPS 基础解析

0 阅读6分钟

一、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提高传输效率