Flask(补充内容)配置SSL 证书 实现 HTTPS 服务

没有加密的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。

python 复制代码
from flask import Flask

app = 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

配置文件内容如下:

bash 复制代码
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://hostrequest_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 服务,确保您的应用安全可靠。

相关推荐
傲笑风2 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架2 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽6 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
迷迭香yy6 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石0087 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王7 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子7 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步7 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
MyFreeIT8 小时前
Let‘s Encrypt SSL 製作免費證書
网络协议·https·ssl
jayson.h8 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python