HTTP 报文是以明文形式传输的,会被各种浏览器标记为不安全。
HTTPS 则提供了一个加密传输的通道,相比较更为安全可靠。但专业的证书要钱,不过有个免费的Let's Encrypt,使用 Certbot 方便快捷,记录下大致的过程。
1. 安装必要工具
sudo apt update
# Certbot 是 Let's Encrypt 提供的证书管理工具
sudo apt install certbot
# python3-certbot-nginx 是专门针对 Nginx 的插件,其可以自动修改 Nginx 配置文件
sudo apt install python3-certbot-nginx
2. 获取并安装证书
# 如果多个域名,可以执行多次,或直接在后面增加 -d 域名,但会被归属到第一个 -d 的域名中,实际不影响任何安全
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# 执行上述语句后,会有交互确认:
# 1. 邮箱输入:输入你的邮箱用于过期提醒。
# 2. 服务条款:同意即可。Y
# 3. 重定向 HTTP 到 HTTPS:Certbot 会询问是否将 HTTP 流量重定向到 HTTPS。 选择 2 (Redirect) 或 Yes(强烈推荐)。这会让 Nginx 自动把所有 http:// 请求转为 https://
# 执行成功后,Certbot 会在 /etc/letsencrypt/live/yourdomain.com/ 下生成相应的证书文件,并自动修改 Nginx 配置文件,添加 SSL 监听端口和证书路径。
# 可自行查看 Nginx 相关配置文件并确认重载。
3. 查看所有证书
sudo certbot certificates
# 一般会显示证书名称、域名信息、过期时间、证书路径等信息
# Saving debug log to /var/log/letsencrypt/letsencrypt.log
#
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Found the following certs:
# Certificate Name: yourdomain.com
# Domains: yourdomain.com www.yourdomain.com
# Expiry Date: 2024-01-05 12:00:00+00:00 (VALID: 89 days)
# Certificate Path: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
# Private Key Path: /etc/letsencrypt/live/yourdomain.com/privkey.pem
# Certificate Name: another-domain.com
# Domains: another-domain.com
# Expiry Date: 2024-01-05 08:30:00+00:00 (VALID: 64 days)
# Certificate Path: /etc/letsencrypt/live/another-domain.com/fullchain.pem
# Private Key Path: /etc/letsencrypt/live/another-domain.com/privkey.pem
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4. 测试自动续期
# Let's Encrypt 证书有效期为 90 天。
sudo certbot renew --dry-run
# 如果输出显示 "Congratulations, all renewals succeeded",则自动续期配置正常。
5. 删除证书
# 推荐,交互式删除,根据列出的信息,选择需要删除的证书即可。
sudo certbot delete
6. Django 安全强化配置(参考)
# settings.py
# 强制所有请求使用 HTTPS
SECURE_SSL_REDIRECT = True
# 如果 Django 运行在反向代理(如 Nginx)后面,需要信任代理的 Header
# 否则 Django 无法识别请求原本是 HTTP 还是 HTTPS
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# 设置 HSTS (HTTP Strict Transport Security),增强安全性
# 单位是秒,例如 31536000 表示一年
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# 确保 Session ID 和 CSRF Token 只在 HTTPS 下传输
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# 防止 JavaScript 访问 Cookie (防 XSS)
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True