没有加密的http服务,就像在裸泳,钻到水里便将你看个精光。数据在互联网上传输时,如果未经加密,随时可能被抓包软件抓住,里面的cookie、用户名、密码什么的,它会看得一清二楚,所以,只要你的项目上网,就必须加载ssl证书,它的重要性风云以前的博文有详细介绍,这里不再赘述。实现https服务,风云在flask系列博文有关于flask项目的安全与部署,但是部署ssl证书介绍得比较笼统,今天补充一篇,在 Flask 中配置 SSL 证书并实现 HTTPS 服务,步骤如下:
步骤 1:获取 SSL 证书
首先,您需要获得一个 SSL 证书。您可以选择购买一个商用证书,也可以使用免费证书提供商,如 Let's Encrypt。这里我们会使用 自签名证书 来做演示。
1.1 创建自签名 SSL 证书(适用于测试环境)
可以通过 OpenSSL 创建一个自签名证书,适合本地开发和测试。
命令:
openssl req -x509 -newkey rsa:4096 -keyout ssl.key -out ssl.crt -days 365
-newkey rsa:4096:生成 4096 位的 RSA 密钥。
-keyout ssl.key:指定私钥的保存文件。
-out ssl.crt:指定证书的保存文件。
-days 365:设置证书的有效期为 365 天。
生成的 ssl.key 为私钥,ssl.crt 为公钥证书。
看到生成的两个文件:ssl.crt、ssl.key 则表示成功。当然,此证书为自签名证书,只适合于测试环境,如果上生产环境,还需专有数字证书,可以上阿里云等申请时长为3个月的免费证书。
步骤 2:在 Flask 中配置 SSL 证书
Flask 的开发服务器支持通过 ssl_context 配置 SSL 证书。您只需在 app.run() 中设置相应的参数。
2.1 配置 Flask 启动 SSL 服务
首先,确保你已经生成了 SSL 证书文件和私钥文件(如 ssl.crt 和 ssl.key)。
然后,修改 Flask 应用启动代码,使其支持 HTTPS。
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello():return "Hello, SSL Flask!"if __name__ == '__main__':# 指定 SSL 证书和私钥文件app.run(ssl_context=('ssl.crt', 'ssl.key'), host='0.0.0.0', port=443, debug=True)
解释:
ssl_context=('ssl.crt', 'ssl.key'):通过此参数指定证书文件和私钥文件。
host='0.0.0.0':监听所有的 IP 地址。
port=443:使用 HTTPS 默认端口 443。
启动应用后,访问 https://localhost/ 即可通过 HTTPS 访问您的 Flask 应用。
步骤 3:配置 Nginx 作为反向代理
在生产环境中,建议通过 Nginx 作为反向代理将 HTTP 请求转发到 Flask 后端,提升性能和安全性。
3.1 安装 Nginx
sudo apt update
sudo apt install nginx
3.2 配置 Nginx 反向代理
编辑 Nginx 配置文件,配置 HTTPS 和反向代理。
sudo nano /etc/nginx/sites-available/yourapp
配置文件内容如下:
server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/ssl.crt;ssl_certificate_key /path/to/ssl.key;location / {proxy_pass http://127.0.0.1:5000; # Flask 应用监听的端口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;}
}server {listen 80;server_name example.com;return 301 https://$host$request_uri; # 将所有 http 请求重定向到 https
}
解释:
listen 443 ssl;:Nginx 在端口 443 上监听 HTTPS 请求。
ssl_certificate 和 ssl_certificate_key:指定 SSL 证书和私钥路径。
proxy_pass:将请求代理到 Flask 后端应用(假设 Flask 应用运行在 5000 端口)。
return 301 https://$host$request_uri;:将所有的 HTTP 请求重定向到 HTTPS。
3.3 启动 Nginx
创建符号链接以启用配置,并重启 Nginx 服务:
sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/
sudo systemctl restart nginx
步骤 4:使用 Let's Encrypt 配置 HTTPS(生产环境)
对于生产环境,推荐使用 Let's Encrypt 免费的 SSL 证书。
4.1 安装 Certbot
首先,安装 Certbot 以便从 Let's Encrypt 获取 SSL 证书。
sudo apt install certbot python3-certbot-nginx
4.2 获取证书
使用 Certbot 自动获取并配置 SSL 证书:
sudo certbot --nginx -d example.com
Certbot 会自动为您生成证书并配置 Nginx。
4.3 自动续期
Let’s Encrypt 的证书有效期为 90 天,因此需要设置自动续期。您可以通过以下命令测试自动续期:
sudo certbot renew --dry-run
如果测试成功,Certbot 将在每次系统更新时自动续期证书。
总结
通过以下步骤,您可以在 Flask 应用中实现 HTTPS 服务:
获取 SSL 证书:可以使用自签名证书或者通过 Let's Encrypt 获取免费证书。
配置 Flask 启动 HTTPS 服务:使用 Flask 内置的 ssl_context 参数启动 HTTPS 服务。
配置 Nginx 反向代理:在生产环境中,使用 Nginx 来管理 HTTPS 连接,提升性能。
Let's Encrypt 配置:对于生产环境,使用 Certbot 获取免费的 SSL 证书并配置自动续期。
通过这些步骤,您可以成功在 Flask 应用中实现 HTTPS 服务,确保您的应用安全可靠。