基于flask的网站如何使用https加密通信

文章目录

    • 内容简介
    • 网站目录示例
    • 生成SSL证书
    • 单独使用Flask
    • 使用WSGI服务器
    • Nginx反向代理
    • 参考资料

在这里插入图片描述

内容简介

HTTPS 是一种至关重要的网络安全协议,它通过在 HTTP 协议之上添加 SSL/TLS 层来确保数据传输的安全性和完整性。这有助于防止数据在客户端和服务器之间传输时被窃听、篡改或伪造,对于保护用户隐私、防范中间人攻击以及增强用户对网站的信任至关重要。

针对 Flask Web 应用,实现 HTTPS 加密的三种推荐方式如下:

  1. 直接使用 Flask 启动 HTTPS

    • 优势:配置过程简单直观,非常适合开发和测试阶段。
    • 局限:在高流量的生产环境中,其性能可能不足以应对需求;自签名证书可能会触发浏览器安全警告,影响用户体验。
    • 实施方法:通过 Flask 应用直接配置 SSL/TLS,并在 443 端口上监听,实现 HTTPS 加密。
  2. 利用 WSGI 服务器(例如 Gunicorn)

    • 优势:相较于 Flask 原生运行,WSGI 服务器能更高效地处理请求,支持生产环境中所需的高级特性,如工作进程和线程的智能管理。
    • 局限:配置过程相对复杂,需要对服务器进行额外的管理和配置。
    • 实施方法:使用 Gunicorn 等 WSGI 服务器运行 Flask 应用,并设置 SSL/TLS,以提升性能和可扩展性。
  3. 部署 Nginx 作为反向代理

    • 优势:Nginx 以其高效率和稳定性而著称,特别适合处理静态内容和代理动态请求,显著增强了 Flask 应用的性能和安全性。
    • 局限:需要对 Nginx 进行配置,并维护额外的服务组件。
    • 实施方法:配置 Nginx 作为反向代理服务器,负责处理 SSL/TLS 加密和提供静态资源,然后将动态请求转发至由 Gunicorn 管理的 Flask 应用。

关于证书的选择

  • 在开发和测试阶段,自签名证书是一个可行的选择。然而,在生产环境中,推荐使用由受信任的证书颁发机构签发的证书,以避免浏览器安全警告并增强用户信任。
  • 第三方证书可以通过多种渠道获取,包括免费证书(例如 Let’s Encrypt 提供的)和商业付费证书,选择时应根据网站的具体需求和预算进行。

总结
选择实现 HTTPS 加密的方法应基于应用的具体需求、预期的流量规模以及维护资源。对于大多数生产环境,推荐配置 Nginx 作为反向代理,并结合 Gunicorn 来运行 Flask 应用,同时采用第三方证书以确保通信的安全性和提升用户信任度。这种配置不仅优化了性能,还强化了安全性,为用户提供了更加安全可靠的网络服务体验。

网站目录示例

构建一个 Flask 网站的目录结构,包括 SSL 自制证书、Nginx 的代理配置文件和 Gunicorn 的启动文件,Nginx 启动文件, 可以按照以下示例进行组织:

/myflaskapp
    /app
        __init__.py
        main.py
    /certs
        myflaskapp.com.conf
        myflaskapp.com.crt
        myflaskapp.com.key
    /nginx
        myflaskapp.conf
    gunicorn_start.sh
    nginx_start.sh

这里是每个部分的详细说明:

  • /myflaskapp:项目的根目录。
  • /app:Flask 应用的目录。
    • __init__.py:初始化 Flask 应用的 Python 文件。
    • main.py:包含 Flask 应用的代码,例如路由和视图函数。
  • /certs:存放 SSL 证书和私钥的目录。
    • myflaskapp.com.conf: SSL配置文件
    • myflaskapp.com.crt:SSL 证书文件。
    • myflaskapp.com.key:SSL 私钥文件。
  • /nginx:存放 Nginx 配置文件的目录。
    • myflaskapp.conf:Nginx 代理配置文件,用于设置反向代理和 SSL 配置。
  • gunicorn_start.sh:启动 Gunicorn 的 shell 脚本。
  • nginx_start.sh:启动 Nginx的 shell 脚本。

在使用 Python 的 Flask 框架时,可以通过集成 OpenSSL 和使用 WSGI 服务器的方式来启用 HTTPS。以下是一些基本步骤来配置 Flask 应用以使用 HTTPS:

生成SSL证书

  1. 配置文件:
    myflaskapp/certs下创建文件·myflaskapp.com.conf, 增加下面配置信息
    [req]
    prompt                  = no
    default_bits            = 4096
    default_md              = sha256
    encrypt_key             = no
    string_mask             = utf8only
    
    distinguished_name      = cert_distinguished_name
    req_extensions          = req_x509v3_extensions
    x509_extensions         = req_x509v3_extensions
    
    
    [ cert_distinguished_name ]
    C  = CN
    ST = BJ
    L  = BJ
    O  = HomeLab
    OU = HomeLab
    CN = myflaskapp.com
    
    [req_x509v3_extensions]
    basicConstraints        = critical,CA:true
    subjectKeyIdentifier    = hash
    keyUsage                = critical,digitalSignature,keyCertSign,cRLSign #,keyEncipherment
    extendedKeyUsage        = critical,serverAuth,clientAuth
    subjectAltName          = @alt_names
    
    [alt_names]
    DNS.1 = myflaskapp.com
    DNS.2 = *.myflaskapp.com
    
  2. 生成 SSL 证书和私钥
    我们还需要一个 SSL 证书和私钥, 基于配置文件,使用 OpenSSL 来生成自签名的证书, 如下所示:
    # 定义文件名称
    OUTPUT_FILENAME="myflaskapp.com"
    # 生成证书和私钥
    openssl req -x509 -newkey rsa:2048 \
    -keyout $OUTPUT_FILENAME.key \
    -out $OUTPUT_FILENAME.crt \
    -days 3600 -nodes \
    -config ${OUTPUT_FILENAME}.conf
    
    这将生成一个有效期为 3600 天的自签名证书 myflaskapp.com.crt 和私钥 myflaskapp.com.key

单独使用Flask

使用 Flask 搭建一个简单的网站并启用 HTTPS 可以通过以下步骤完成:

  1. 安装 Flask
    首先,确保你已经安装了 Python3,然后使用 pip3 来安装 Flask 库:

    pip3 install flask
    
  2. 创建 Flask 应用
    myflaskapp/app 目录下创建一个名为 main.py 的文件,并添加以下代码:

    from flask import Flask, request, redirect
    
    app = Flask(__name__)
    
    @app.before_request
    def before_request():
        if request.scheme == 'http':
            return redirect(request.url.replace('http://', 'https://', 1))
    
    @app.route('/')
    def index():
        return 'Hello, Flask with SSL!'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=443, ssl_context=('../certs/myflaskapp.com.crt', '../certs/myflaskapp.com.key'))
    

    这段代码做了以下几件事情:

    • 定义了一个 Flask 应用。
    • 使用 before_request 装饰器来检查请求的协议,如果是 HTTP,则重定向到 HTTPS。
    • 定义了一个路由 /,当访问网站根目录时返回Hello, Flask with SSL
    • 运行应用,监听所有公共 IP 地址上的 443 端口,并使用指定的 SSL 证书和私钥启用 HTTPS。
  3. 启动 Flask 应用
    在命令行中运行以下命令来启动你的 Flask 应用:

    python3 main.py
    
  4. 配置域名映射
    将你的 Flask 应用的 宿主机IP地址 映射到域名 myflaskapp.com。对于windows用户可以在C:\Windows\System32\drivers\etc 文件夹下的host文件增加下面内容:

    <your-host-ip>  myflaskapp.com
    
  5. 浏览器访问
    在浏览器中输入 https://myflaskapp.com 访问你的网站。请注意,使用自签名证书会在浏览器中产生安全警告,因为自签名证书不被浏览器信任

  6. 安装证书

    • 对于 Windows 用户,可以从服务器导出证书myflaskapp.com.crt,通过双击证书文件并按照提示安装。证书安装在受信任的根证书颁发机构目录下。
      在这里插入图片描述
    • 安装完成后,重启浏览器,能够安全访问你的网站。
      在这里插入图片描述

请注意,使用自签名证书在生产环境中是不推荐的,因为它不被浏览器信任。在实际部署时,应该使用由受信任的证书颁发机构签发的证书。此外,确保你的 SSL 证书和私钥文件路径正确无误,并且具有正确的权限设置。

使用WSGI服务器

在生产环境中部署 Flask 应用时,使用 WSGI 服务器如 Gunicorn 可以提供更好的性能和稳定性。以下是使用 Gunicorn 部署 Flask 应用的步骤,包括一些优化的描述:

  1. 安装 Gunicorn
    使用 pip3 安装 Gunicorn,这是 Python 的一个 WSGI HTTP 服务器,用于生产环境, 如下:

    pip3 install gunicorn
    
  2. 创建启动脚本
    myflaskapp 目录下创建一个名为 start_gunicorn.sh 的启动脚本,并添加以下内容。这个脚本将配置 Gunicorn 以使用 HTTPS 运行 Flask 应用:

    #!/bin/bash
    export MYFLASKAPP_HOME='/your/path/to/myflaskapp'
    gunicorn -w 4 -b 0.0.0.0:443 \
    --keyfile ${MYFLASKAPP_HOME}/certs/openssl/myflaskapp.com.key \
    --certfile ${MYFLASKAPP_HOME}/certs/openssl/myflaskapp.com.crt \
    --chdir ${MYFLASKAPP_HOME}/app main:app
    
    • -w 4 表示使用 4 个工作进程来处理请求。
    • -b 0.0.0.0:443 表示监听所有公共 IP 的 443 端口,允许来自任何 IP 的访问。
    • --keyfile--certfile 指定了 SSL 私钥和证书文件的路径,确保 HTTPS 连接的安全性。
    • ./app.main:app 是 Flask 应用的模块和应用变量的引用。
  3. 启动 Gunicorn 服务
    给脚本文件添加执行权限,并运行它来启动 Gunicorn 服务:

    chmod +x start_gunicorn.sh
    ./start_gunicorn.sh
    

    这样,你的 Flask 应用就会以 Gunicorn 作为 WSGI 服务器在后台运行。

  4. 浏览器访问
    在浏览器中输入 https://myflaskapp.com 来访问你的网站。由于使用了 SSL/TLS 证书,你的连接将是加密的,浏览器会显示安全连接。

Nginx反向代理

部署 Flask 应用到生产环境时,使用 Nginx 作为反向代理服务器不仅可以提高应用的性能,还可以增强安全性。以下是使用 Nginx 和 Gunicorn 部署 Flask 应用的步骤:

  1. 拉取 Nginx 镜像
    使用 Docker 拉取最新的 Nginx 镜像:

    docker pull nginx
    
  2. 修改 Flask 应用
    更新 myflaskapp/app/main.py 文件,确保 Flask 应用默认不绑定端口和不启用 SSL,因为它将由 Nginx 处理:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return 'Hello, Flask with SSL!'
    
    if __name__ == '__main__':
        app.run()
    
  3. 修改 Gunicorn 启动脚本
    更新 myflaskapp/start_gunicorn.sh 脚本,确保 Gunicorn 监听 5000 端口(或其他非标准端口),因为 Nginx 将转发请求到这个端口:

    #!/bin/bash
    export MYFLASKAPP_HOME='/path/to/your/myflaskapp'
    nohup gunicorn -w 4 -b 0.0.0.0:5000 -chdir ${MYFLASKAPP_HOME}/app main:app &
    
  4. 配置 Nginx 反向代理
    在 Nginx 配置文件 myflaskapp/nginx/myflaskapp.conf 中设置反向代理规则:

    server {
        listen 80;
        server_name myflaskapp.com;
        return 301 https://$server_name$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name myflaskapp.com www.myflaskapp.com;
    
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/key.pem;
    
        location / {
            proxy_pass http://<your-flask-host>:5000; # 假设 Flask 应用运行在同一个主机的 5000 端口
            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;
        }
    }
    

    注意:proxy_pass 应该指向 Gunicorn 监听的地址和端口,<your-flask-host>替换为Flask应用服务器IP地址。

  5. 创建 Nginx 启动脚本
    创建 myflaskapp/start_nginx.sh 脚本来启动 Nginx 容器,并挂载配置文件和 SSL 证书:

    #!/bin/bash
    sudo docker run \
      -d \
      -p 443:443 \
      -p 80:80 \
      -v $(pwd)/nginx/myflaskapp.conf:/etc/nginx/conf.d/myflaskapp.conf \
      -v $(pwd)/certs/:/etc/nginx/ssl/ \
      --name https-nginx nginx:latest
    
  6. 启动服务
    首先启动 Gunicorn 服务,然后启动 Nginx 服务:

    ./start_gunicorn.sh
    ./start_nginx.sh
    
  7. 浏览器访问
    在浏览器中输入 https://myflaskapp.com 访问你的网站。由于 Nginx 配置了 SSL 证书,连接将是安全的,浏览器将显示安全连接。

参考资料

如何制作和使用自签名证书
自签证书让Chrome信任的方式
使用自签名SSL证书配置HTTPS,解决浏览器提示不安全警告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/707059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端实现获取后端返回的文件流并下载

前端实现获取后端返回的文件流并下载 方法一&#xff1a;使用Axios实现文件流下载优点缺点 方法二&#xff1a;使用封装的Request工具实现文件流下载优点缺点 方法三&#xff1a;直接通过URL跳转下载优点缺点 结论 在前端开发中&#xff0c;有时需要从后端获取文件流&#xff0…

Android studio如何导入项目

打开解压好的安装包 找到build.gradle文件 打开查看gradle版本 下载对应的gradle版本Index of /gradle/&#xff08;镜像网站&#xff09; 下载all的对应压缩包 配置gradle的环境变量 新建GRADLE_HOME 将GRADLE_HOME加入到path中 将项目在Android studio中打开进行配置 将gr…

前端 CSS 经典:在 Vue3 中使用渐进式图片

1. 什么是渐进式图片 当我们网站会加载很多图片的时候&#xff0c;有些图片尺寸很大&#xff0c;加载就会很慢&#xff0c;会导致页面长时间陷入白屏状态&#xff0c;用户体验很不好。所以可以使用渐进式图片&#xff0c;先给用户展示模糊图&#xff0c;这些图尺寸小&#xff…

嵌入式硬件VS软件,到底哪个更难?

在嵌入式系统开发中&#xff0c;硬件和软件是密不可分的两个方面。但是&#xff0c;究竟是硬件开发更具挑战性&#xff0c;还是软件开发更难以应对呢&#xff1f;本文将就这一问题展开讨论&#xff0c;探究嵌入式硬件和软件在开发过程中的各种挑战与特点。 一、硬件开发&#…

5.7 Python内置函数

文章目录 1. 内置模块Aabs()all()any()ascii() Bbin()bool()bytearra()bytes() Ccallable()chr()classmethod()compile()complex() Ddelattr()dict()dir()divmod() Eenumerate()eval()exec()execfile() Ffile()filter()float()format()frozenset() Ggetattr()globals() Hhasatt…

C++ 23 之 构造函数和析构函数

c23构造函数和析构函数.cpp #include <iostream> #include <string> using namespace std;class Person2{ public:// 构造函数 没有返回值&#xff0c;不能写void;函数名和类名一致&#xff1b;可以设置参数&#xff0c;可以函数重载&#xff1b;系统自动调用&…

人工智能将成为数学家的“副驾驶”

人工智能将成为数学家的“副驾驶” 数学传统上是一门独立的科学。1986年&#xff0c;安德鲁怀尔斯为了证明费马定理&#xff0c;退到书房里呆了7年。由此产生的证明往往很难让同事们理解&#xff0c;有些至今仍有争议。但近年来&#xff0c;越来越多的数学领域被严格地分解为各…

[大模型]Phi-3-mini-4k-instruct langchain 接入

环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 创建工作…

C++ | Leetcode C++题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {int n tokens.size();vector<int> stk((n 1) / 2);int index -1;for (int i 0; i < n; i) {string& token tokens[i];if (token.length() >…

Siemens-NXUG二次开发-创建平面(无界非关联)、固定基准面[Python UF][20240614]

Siemens-NXUG二次开发-创建平面&#xff08;无界非关联&#xff09;、固定基准面[Python UF][20240614] 1.python uf函数1.1 NXOpen.UF.Modeling.CreatePlane1.2 NXOpen.UF.ModlFeatures.CreateFixedDplane 2.示例代码2.1 pyuf_plane.py 3.运行结果3.1 内部模式3.1.1 NXOpen.UF…

DTU为何应用如此广泛?

1.DTU是什么 DTU(数据传输单元)是一种无线终端设备&#xff0c;它的核心功能是将串口数据转换为IP数据或将IP数据转换为串口数据&#xff0c;并通过无线通信网络进行传送。DTU通常内置GPRS模块&#xff0c;能够实现远程数据的实时传输&#xff0c;广泛应用于工业自动化、远程监…

【MySQL】日志详解

本文使用的MySQL版本是8 日志概览 它们记录了数据库系统中的不同操作和事件&#xff0c;以便于故障排除、性能优化和数据恢复。本文将介绍MySQL中常见的几种日志&#xff0c;同时也会介绍一点常用的选项。 官方文档&#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 7.4 M…

Golang | Leetcode Golang题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; func maxPoints(points [][]int) (ans int) {n : len(points)if n < 2 {return n}for i, p : range points {if ans > n-i || ans > n/2 {break}cnt : map[int]int{}for _, q : range points[i1:] {x, y : p[0]-q[0], p[1]-q[1]if…

字符串的复杂操作(字符串的下标和切片、以及字符串的相关操作函数方法)

如果使用不符合标准的标识符,将会报错 SyntaxError: incalid syntax(无效语法) 文章目录 一、字符串的复杂操作1.1 下标&#xff08;也叫索引&#xff09;1.2 切片 一、字符串的复杂操作 1.1 下标&#xff08;也叫索引&#xff09; 下标代表着第几个数据&#xff0c;从0开始计…

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; int evalRPN(char** tokens, int tokensSize) {int n tokensSize;int stk[(n 1) / 2];memset(stk, 0, sizeof(stk));int index -1;for (int i 0; i < n; i) {char* token tokens[i];if (strlen(token) > 1 || isdigit(token[0])…

生命在于学习——Python人工智能原理(3.4)

三、深度学习 7、过拟合与欠拟合 过拟合和欠拟合是所有机器学习算法都要考虑的问题。 &#xff08;1&#xff09;基本定义 a、欠拟合 欠拟合是指机器学习模型无法完全捕获数据集中的复杂模式&#xff0c;导致模型在新数据上的表现不佳&#xff0c;这通常是由于模型过于简单…

SemanticKITTI 拼接语义点云帧

文章目录 KITTISemanticKITTISemantic Segmentation and Panoptic SegmentationSemantic Scene Completion 数据转换语义标签和点云拼接 KITTI The odometry benchmark consists of 22 stereo sequences, saved in loss less png format: We provide 11 sequences (00-10) wit…

群体优化算法----多乌鸦搜寻算法介绍,找多目标函数组解,Pareto前沿

介绍 乌鸦搜寻算法&#xff08;Crow Search Algorithm&#xff0c;CSA&#xff09;是一种新型的群体智能优化算法&#xff0c;其灵感来源于乌鸦的行为特性&#xff0c;尤其是乌鸦在食物搜寻和藏匿过程中的智能行为。乌鸦是一种高度聪明的鸟类&#xff0c;它们展示出复杂的社会…

对补码的理解:两种求法

课本的结论是&#xff1a;二进制数的最高位是符号位。符号位为 0 表示正数和 零 &#xff0c;符号位为 1 表示负数。 正数是原码反码补码都是一样的。负数的反码是&#xff1a;符号位不变&#xff0c;剩下位取反。 负数的补码是&#xff1a;符号位不变&#xff0c;剩下位取反&a…

eclipse创建maven项目

第一步&#xff1a;打开eclipse 我们选择java项目即可 点击finish即可 它会自动下载插件 然后在控制台上输入Y即可