在生产环境中,确保用户与服务器之间的数据传输安全至关重要。配置 HTTPS(HTTP Secure)可以通过使用 SSL/TLS 协议对数据进行加密,防止数据在传输过程中被窃听或篡改。本文将详细介绍如何使用 Let’s Encrypt 免费获取 SSL 证书,并配置 Nginx 以支持 HTTPS。
Let’s Encrypt 是一个免费、自动化、开放的证书颁发机构(CA),可以为您的域名颁发可信的 SSL/TLS 证书。
Certbot 是 Electronic Frontier Foundation(EFF)开发的自动化工具,协助获取和更新 SSL 证书。
在 Ubuntu/Debian 系统上,执行以下命令安装 Certbot:
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
解释:
sudo apt-get update
:更新软件包列表,确保获取最新的软件版本。sudo apt-get install certbot python3-certbot-nginx
:
在获取证书之前,确保您的域名(如 your_domain.com
)的 A 记录 已指向您的服务器公网 IP 地址。
注意:
确保服务器的 80(HTTP)端口和 443(HTTPS)端口是开放的:
sudo ufw allow 80
sudo ufw allow 443
解释:
Certbot 可以自动获取证书并配置 Nginx,无需手动编辑配置文件。
执行以下命令:
sudo certbot --nginx -d your_domain.com
解释:
sudo certbot
:以管理员权限运行 Certbot。--nginx
:指定使用 Nginx 插件,自动配置 Nginx。-d your_domain.com
:指定要为其获取证书的域名,如果有多个域名,可使用 -d
多次,例如 -d example.com -d www.example.com
。运行上述命令后,Certbot 会引导您完成以下步骤:
输入电子邮件地址:
同意服务条款:
是否同意分享电子邮件地址:
选择配置选项:
Certbot 将完成以下操作:
获取域名的 SSL 证书:
自动配置 Nginx:
设置自动续期:
在浏览器中访问:
https://your_domain.com
验证内容:
Certbot 自动对 Nginx 配置进行了修改,您可以检查生成的配置文件,例如:
sudo nano /etc/nginx/sites-available/your_domain.com
配置文件示例:
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:5001; # 代理到 Gunicorn
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /path/to/your/app/static/;
}
}
说明:
第一个 server
块:
第二个 server
块:
可以使用 SSL Labs 提供的在线工具测试您的 SSL 证书和安全配置:
虽然 Certbot 在安装时会自动创建续期计划任务,但建议定期手动验证,以确保证书能够成功续期。
执行以下命令测试续期过程:
sudo certbot renew --dry-run
解释:
--dry-run
:模拟续期过程,不实际更改证书。如果输出结果没有错误,表示续期流程正常。
Certbot 使用 systemd 定时器或 cron 任务进行自动续期。
查看 systemd 定时器:
systemctl list-timers
或检查 cron 任务:
sudo crontab -l
如果您希望自行配置 Nginx,而不是让 Certbot 自动完成,可以按照以下步骤进行。
执行以下命令,仅获取证书:
sudo certbot certonly --nginx -d your_domain.com
解释:
certonly
:仅获取证书,不自动配置服务器。参考以下示例,在您的 Nginx 配置文件中添加 SSL 配置:
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
# 您的反向代理配置
}
location /static/ {
# 静态文件配置
}
}
注意:
确保 SSL 相关的参数配置正确。
重启 Nginx 以应用更改:
sudo nginx -t # 测试配置文件是否有语法错误
sudo systemctl restart nginx
症状:
可能原因:
解决方案:
确认域名的 DNS 记录正确设置,并已生效。
检查防火墙设置,确保 80 端口开放:
sudo ufw allow 80
症状:
可能原因:
解决方案:
手动执行续期命令,查看错误信息:
sudo certbot renew --dry-run
根据错误提示进行相应的调整。
可能原因:
解决方案:
获取包含所有需要域名的通配符证书或为子域名单独获取证书:
sudo certbot --nginx -d your_domain.com -d subdomain.your_domain.com
检查证书的有效期,必要时手动续期。
通过上述步骤,您已成功为您的 Flask 应用配置了 HTTPS,加密了用户与服务器之间的数据传输,提升了应用的安全性和用户信任度。
关键点回顾:
后续建议:
定期检查证书状态:即使有自动续期,也要定期验证。
关注安全公告:保持 Certbot 和系统软件的更新,修复已知漏洞。
使用 HSTS(HTTP 严格传输安全):在 Nginx 配置中添加 Strict-Transport-Security
头部,强制客户端使用 HTTPS。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
优化 SSL 配置:根据最新的安全标准,调整加密套件和协议版本。
通过正确配置 HTTPS,您的 Flask 应用将在提供安全、高效服务的同时,增强用户对您的信任。