主题
🌍 HTTP 与 HTTPS 协议
上网的本质:浏览器发一个 HTTP 请求,服务器回一个 HTTP 响应
HTTP 是什么
HTTP = HyperText Transfer Protocol,超文本传输协议。基于 TCP,默认端口 80。
客户端(浏览器) 服务器(nginx)
│ │
│ GET /index.html HTTP/1.1 │
│ Host: kb.sirenzhuli.cn │
│──────────────────────────────────→│
│ │
│ HTTP/1.1 200 OK │
│ Content-Type: text/html │
│ │
│ <html>...页面内容...</html> │
│←──────────────────────────────────│HTTP 请求方法
| 方法 | 含义 | 场景 |
|---|---|---|
| GET | 获取资源 | 打开网页、查 API |
| POST | 提交数据 | 登录、表单提交 |
| PUT | 替换资源 | 更新整条数据 |
| DELETE | 删除资源 | 删记录 |
| PATCH | 部分更新 | 改一个字段 |
| HEAD | 只要响应头 | 检查资源是否存在 |
| OPTIONS | 看支持哪些方法 | CORS 预检 |
HTTP 状态码
2xx 成功
| 状态码 | 含义 |
|---|---|
| 200 OK | 请求成功 |
| 201 Created | 创建成功(POST 后) |
| 204 No Content | 成功但无返回体 |
3xx 重定向
| 状态码 | 含义 |
|---|---|
| 301 Moved Permanently | 永久迁移(域名换了) |
| 302 Found | 临时跳转 |
| 304 Not Modified | 没变化,用缓存 |
4xx 客户端错误
| 状态码 | 含义 | 常见原因 |
|---|---|---|
| 400 Bad Request | 请求格式不对 | JSON 解析失败 |
| 401 Unauthorized | 没登录 | Token 过期 |
| 403 Forbidden | 没权限 | nginx deny |
| 404 Not Found | 资源不存在 | URL 写错 |
| 405 Method Not Allowed | 方法不对 | GET 改 POST 没配 |
| 429 Too Many Requests | 请求太频繁 | 触发了限流 |
5xx 服务端错误
| 状态码 | 含义 | 常见原因 |
|---|---|---|
| 500 Internal Server Error | 服务器内部错误 | 代码崩了 |
| 502 Bad Gateway | 网关错误 | 上游服务挂了 |
| 503 Service Unavailable | 服务不可用 | 正在重启 |
| 504 Gateway Timeout | 网关超时 | 上游处理太久 |
HTTP 请求头(常用)
http
GET /api/users HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0 (浏览器标识)
Accept: application/json
Authorization: Bearer eyJhbGci...
Content-Type: application/json
Cookie: session_id=abc123响应头
http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 256
Cache-Control: max-age=3600
Set-Cookie: session_id=xyz789; HttpOnly; Secure
Access-Control-Allow-Origin: *HTTPS = HTTP + TLS 加密
| 对比 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | 明文(谁抓包谁看光) | TLS 加密 |
| 证书 | 不需要 | 需要 SSL 证书 |
| SEO | 搜索引擎不优先 | 优先收录 |
| 浏览器 | 显示 ⚠️ 不安全 | 显示 🔒 |
TLS 握手(简化)
客户端 服务器
│ │
│ ClientHello(支持的加密套件)│
│─────────────────────────────→│
│ │
│ ServerHello + 证书 + 公钥 │
│←─────────────────────────────│
│ │
│ 验证证书 ✓ │
│ 生成对称密钥,用公钥加密 │
│─────────────────────────────→│
│ │
│ 开始加密通信 │
│←════════════════════════════→│用 curl 测试 HTTP
bash
# GET 请求
curl https://kb.sirenzhuli.cn
# 只看响应头
curl -I https://kb.sirenzhuli.cn
# POST JSON 数据
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123"}'
# 带 Authorization
curl -H "Authorization: Bearer <token>" \
https://api.example.com/users
# 看详细过程(含 TLS 握手)
curl -v https://kb.sirenzhuli.cn
# 忽略证书验证(仅测试用!)
curl -k https://localhost:8443HTTPS 排故
bash
# 1. 证书是否有效
openssl s_client -connect kb.sirenzhuli.cn:443 -servername kb.sirenzhuli.cn </dev/null 2>/dev/null | \
openssl x509 -noout -dates -subject
# 2. 证书链是否完整
openssl s_client -connect kb.sirenzhuli.cn:443 -showcerts
# 3. 支持的 TLS 版本
nmap --script ssl-enum-ciphers -p 443 kb.sirenzhuli.cn🎯 本章要点
- HTTP 状态码:2xx 成功、3xx 跳转、4xx 你错了、5xx 我错了
- HTTPS = HTTP + TLS,证书验证身份 + 加密数据
- curl 是 HTTP 排故瑞士军刀:
-I看头、-v看过程、-k跳过证书 - 查证书到期:
openssl s_client ... | openssl x509 -dates - 4xx/5xx 排查顺序:nginx error log → 应用日志 → 代码
加载练习题中...