Kamixitong/docs/HTTPS_SETUP_GUIDE.md
2025-12-12 11:35:14 +08:00

357 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HTTPS 配置指南
## 📋 概述
HTTPS 是生产环境必需的安全配置。本指南将帮助您配置 SSL/TLS 加密,确保数据传输安全。
## 🎯 配置方案
### 方案 1: Let's Encrypt 免费证书(推荐)
**优点**
- ✅ 完全免费
- ✅ 自动续期
- ✅ 浏览器信任
- ✅ 简单易用
**适用场景**:生产环境,有公网域名
#### 1.1 安装 Certbot
```bash
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx
# macOS
brew install certbot
```
#### 1.2 申请证书
```bash
# 自动配置 Nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# 或使用手动模式
sudo certbot certonly --webroot -w /var/www/html -d your-domain.com
```
#### 1.3 自动续期
```bash
# 测试续期
sudo certbot renew --dry-run
# 添加到 crontab
echo "0 12 * * * /usr/bin/certbot renew --quiet" | sudo crontab -
```
### 方案 2: 自签名证书
**优点**
- ✅ 快速配置
- ✅ 无需域名
- ✅ 免费
**缺点**
- ❌ 浏览器不信任(需要手动添加信任)
- ❌ 适用于内部系统
**适用场景**:开发环境、内部测试
#### 2.1 生成证书
```bash
# 使用脚本生成
python3 scripts/generate_ssl.py
# 或手动生成
mkdir certs
openssl genrsa -out certs/localhost.key 2048
openssl req -new -x509 -key certs/localhost.key -out certs/localhost.crt -days 365 -subj "/C=CN/ST=Beijing/L=Beijing/O=KaMiXiTong/CN=localhost"
```
#### 2.2 浏览器信任证书
1. 打开浏览器设置
2. 搜索"证书"或"Certificates"
3. 导入证书certs/localhost.crt
4. 信任该证书
### 方案 3: 商业 SSL 证书
**优点**
- ✅ 最高级别的信任
- ✅ 提供保险
- ✅ 专业支持
**适用场景**:大型企业、电商平台
## 🔧 Nginx 配置
### 3.1 复制配置
```bash
# 复制示例配置
sudo cp nginx.conf.example /etc/nginx/sites-available/kamaxitong
# 编辑配置
sudo nano /etc/nginx/sites-available/kamaxitong
```
### 3.2 修改配置
```nginx
# 修改域名
server_name your-domain.com www.your-domain.com;
# 修改证书路径Let's Encrypt
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# 或使用自签名证书
ssl_certificate /var/www/kamaxitong/certs/your-domain.com.crt;
ssl_certificate_key /var/www/kamaxitong/certs/your-domain.com.key;
```
### 3.3 启用站点
```bash
# 启用站点
sudo ln -s /etc/nginx/sites-available/kamaxitong /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启 Nginx
sudo systemctl reload nginx
```
### 3.4 配置防火墙
```bash
# 允许 HTTP 和 HTTPS
sudo ufw allow 80
sudo ufw allow 443
# 或使用 iptables
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
```
## 🐍 Flask 应用配置
### 4.1 环境变量配置
`.env` 文件中设置:
```bash
# 强制 HTTPS生产环境
SESSION_COOKIE_SECURE=true
REMEMBER_COOKIE_SECURE=true
# 域名配置
FRONTEND_DOMAIN=your-domain.com
# 启用 HTTPS 重定向(可选)
FORCE_HTTPS=true
```
### 4.2 Flask 强制 HTTPS
`app/__init__.py` 中添加:
```python
from flask import request, redirect, url_for
from werkzeug.middleware.proxy_fix import ProxyFix
def create_app():
app = Flask(__name__)
# ... 其他配置 ...
# 启用 ProxyFix如果使用反向代理
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1, x_prefix=1)
# 强制 HTTPS生产环境
@app.before_request
def force_https():
if app.config.get('FORCE_HTTPS') and not request.is_secure:
url = request.url.replace('http://', 'https://', 1)
return redirect(url, code=301)
return app
```
### 4.3 安全响应头
`app/__init__.py` 中添加:
```python
from flask import make_response
def add_security_headers(response):
"""添加安全响应头"""
# HSTS
response.headers['Strict-Transport-Security'] = 'max-age=63072000; includeSubDomains; preload'
# X-Frame-Options
response.headers['X-Frame-Options'] = 'DENY'
# X-Content-Type-Options
response.headers['X-Content-Type-Options'] = 'nosniff'
# X-XSS-Protection
response.headers['X-XSS-Protection'] = '1; mode=block'
# Referrer-Policy
response.headers['Referrer-Policy'] = 'strict-origin-when-cross-origin'
return response
# 注册响应处理器
@app.after_request
def after_request(response):
return add_security_headers(response)
```
## 🔍 验证配置
### 5.1 测试 HTTPS 访问
```bash
# 检查证书
openssl s_client -connect your-domain.com:443 -servername your-domain.com
# 或使用 curl
curl -I https://your-domain.com
# 检查健康检查端点
curl -I https://your-domain.com/api/v1/health
```
### 5.2 在线测试
使用以下工具测试 SSL 配置:
1. **SSL Labs**: https://www.ssllabs.com/ssltest/
2. **Why No Padlock**: https://www.whynopadlock.com/
3. **Mozilla SSL Configuration Generator**: https://ssl-config.mozilla.org/
### 5.3 检查安全评级
在 SSL Labs 测试中,应达到:
-**A+ 评级**
-**TLS 1.2 和 1.3**
-**HSTS 启用**
-**无弱密码**
## 🚨 常见问题
### Q1: 证书过期怎么办?
```bash
# 手动续期
sudo certbot renew
# 检查过期时间
openssl x509 -in /etc/letsencrypt/live/your-domain.com/cert.pem -noout -dates
```
### Q2: 自签名证书不被信任?
1. 在浏览器中访问网站
2. 点击"高级" → "继续访问"
3. 导入证书到受信任存储
### Q3: 混合内容警告?
确保所有资源CSS、JS、图片都使用 HTTPS
```html
<!-- 正确 -->
<link rel="stylesheet" href="https://your-domain.com/static/css/style.css">
<!-- 错误 -->
<link rel="stylesheet" href="http://your-domain.com/static/css/style.css">
```
### Q4: 如何强制重定向到 HTTPS
在 Nginx 配置中添加:
```nginx
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
```
## 📊 性能优化
### 6.1 启用 HTTP/2
```nginx
server {
listen 443 ssl http2;
# ...
}
```
### 6.2 启用 Gzip 压缩
```nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
```
### 6.3 配置缓存
```nginx
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
```
## 📝 部署清单
- [ ] 申请 SSL 证书
- [ ] 配置 Nginx
- [ ] 启用 HTTPS 重定向
- [ ] 配置防火墙规则
- [ ] 设置自动续期Let's Encrypt
- [ ] 测试 HTTPS 访问
- [ ] 检查 SSL 评级
- [ ] 配置安全响应头
- [ ] 测试混合内容
- [ ] 验证证书过期时间
## 🔗 相关资源
- [Let's Encrypt 官网](https://letsencrypt.org/)
- [Mozilla SSL 配置生成器](https://ssl-config.mozilla.org/)
- [SSL Labs 测试工具](https://www.ssllabs.com/ssltest/)
- [Nginx SSL 配置指南](https://nginx.org/en/docs/http/configuring_https_servers.html)
## ✅ 完成检查
完成 HTTPS 配置后,访问以下 URL 验证:
1. **HTTPS 首页**: `https://your-domain.com`
2. **API 健康检查**: `https://your-domain.com/api/v1/health`
3. **SSL 评级**: 使用 SSL Labs 测试
如果一切正常,您应该看到:
- ✅ 浏览器显示绿色锁图标
- ✅ 健康检查返回 200 状态码
- ✅ SSL 评级为 A 或 A+
**🎉 恭喜!您的网站已启用 HTTPS**