基于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__.pymain.py/certsmyflaskapp.com.confmyflaskapp.com.crtmyflaskapp.com.key/nginxmyflaskapp.confgunicorn_start.shnginx_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             = utf8onlydistinguished_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, redirectapp = 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 Flaskapp = 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,解决浏览器提示不安全警告

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高考志愿专业选择:计算机人才需求激增,人工智能领域成热门

随着2024年高考的落幕&#xff0c;数百万高三学生站在了人生新的十字路口&#xff0c;面临着一个重要的抉择&#xff1a;选择大学专业。这一选择不仅关乎未来四年的学习生涯&#xff0c;更可能决定一个人一生的职业方向和人生轨迹。在众多专业中&#xff0c;计算机相关专业因其…

如何用Xinstall CPS结算系统打破传统营销桎梏,实现用户增长?

在互联网流量红利逐渐衰退的今天&#xff0c;App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系&#xff0c;成为了众多企业急待解决的问题。而在这个关键时刻&#xff0c;Xinstall CPS结算系统应运而生&#xff0c;以其独特的优势帮助企业解决了一系列…

深度学习500问——Chapter11:迁移学习(2)

文章目录 11.2 迁移学习的基本思路有哪些 11.2.1 基于样本迁移 11.2.2 基于特征迁移 11.2.3 基于模型迁移 11.2.4 基于关系迁移 11.2 迁移学习的基本思路有哪些 迁移学习的基本方法可以分为四种。这四种基本方法分别是&#xff1a;基于样本的迁移&#xff0c;基于模型的迁移&a…

Sa-Token鉴权与网关服务实现

纠错&#xff1a; 在上一部分里我完成了微服务框架的初步实现&#xff0c;但是先说一下之前有一个错误&#xff0c;就是依赖部分 上次的学习中我在总的父模块下引入了spring-boot-dependencies&#xff08;版本控制&#xff09;我以为在子模块下就不需要再引用了&#xff0c;…

Opencv图像梯度计算

Opencv图像梯度计算 Sobel算子 可以理解为是做边缘检测的一种方法。 首先说明自己对图像梯度的简单理解&#xff1a;简单理解就是图像的颜色发生变化的边界区域在X方向和Y方向上的梯度值 Gx Gy 而Gx和Gy处的梯度的计算—使用下面的公式来进行计算。 G x [ − 1 0 1 − 2 0 …

【计算机毕业设计】258基于微信小程序的课堂点名系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

总结【GetHub的WebAPI,ASSET_ID】,【Linux的jq命令】(草稿版+实际操作)

目录 1.介绍一下github中的 asset_id 2. GitHub 的 asset_id相关操作 2.1.获取特定 repository 的 release 列表&#xff1a; 2.2.获取特定 release 中的 asset 列表&#xff0c;并找到 asset_id&#xff1a; 2.3.使用ASSET_ID获取资材 3.返回的 assets 的信息 是什么样样…

【STM32CubeIDE -使用-调试过程中-遇到的“弹窗”报错问题-部分总结-处理方式】

【STM32CubeIDE -使用-调试过程中-遇到的“弹窗”报错问题-部分总结-处理方式】 1、前言2、软件环境问题1&#xff1a;Confirm Perspective Switch&#xff08;确认视角切换&#xff09;&#xff08;1&#xff09;问题描述:This kind of launch is configured to open the Debu…

14、modbus poll 使用教程小记1

开发平台&#xff1a;Win10 64位 Modbus Slave版本&#xff1a;64位 7.0.0 Modbus Poll版本&#xff1a;64位 7.2.2 因为项目中经常会用到modbus协议&#xff0c;所以就避免不了的要使用modbus测试工具&#xff0c;Modbus Slave/Poll无疑是众多测试工具中应用最广泛的。 文章目…

C语言的数据结构:串、数组、广义表

一、串 1、串的定义 串是一个线性表&#xff0c;但其节点中的内容只能为字符&#xff0c;所以也称为字符串。 字符串中可以有多个字符&#xff0c;也可以没有字符。没有字符的叫作&#xff1a;空串。 空串&#xff1a;""。 有值的串&#xff1a;"1123"。 只…

yolov3 详解

文章目录 1、yolov3原理2、损失函数3、yolov3改进4、使用opencv实现yolov35、卷积神经网络工作原理 1、yolov3原理 参考视频 darknet53&#xff1a;52个卷积层和1个全联接层 输入图像为416416 1313 -》 下采样32倍 2626 -》 下采样16倍 5252 -》 下采样8倍 由标注框中心点落在…

13600KF+3060Ti,虚拟机安装macOS 14,2024年6月

距离上次装macOS虚拟机已经有一段时间了&#xff0c;macOS系统现在大版本升级的速度也是越来越快了&#xff0c;由于Office只支持最新三个版本的macOS&#xff0c;所以现在保底也得安装macOS 12了&#xff0c;我这次是用macOS 14做实验&#xff0c;13和12的安装方式和macOS 14一…

eNSP学习——PPP的认证

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置PPP的PAP认证 4、配置PPP的CHAP认证 主要命令 //设置本端的PPP协议对对端设备的认证方式为 PAP&#xff0c;认证采用的域名为huawei [R3]int s4/0/0 [R…

Android 14 系统启动流程 之 启动init进程、启动Zygote进程

Android 14 系统启动流程 之 启动init进程、启动Zygote进程 废话不多说&#xff0c;先上图&#xff0c;不清楚的可以在评论区留言。

【论文阅读】-- 时态合并树状图:时态标量数据的基于拓扑的静态可视化

时态合并树状图&#xff1a;时态标量数据的基于拓扑的静态可视化 摘要1 引言2 相关工作及背景介绍2.1 增广合并树2.2 (增强)合并树的可视化与跟踪2.3 特征跟踪2.4 数据线性化 3 时间合并树状图3.1 映射单个时间步长&#xff1a; R d → R R^d \rightarrow R Rd→R3.2 映射所有时…

python:faces swap

# encoding: utf-8 # 版权所有 2024 涂聚文有限公司 # 许可信息查看&#xff1a;pip install boost # 描述&#xff1a;pip install boost # pip install dlib # pip install cmake3.25.2 # pip install dlib19.24.2 如果安装不上&#xff0c;按此法 # Author : geovindu,G…

实用软件下载:MathType最新安装包及详细安装教程

MathType是强大的数学公式编辑器&#xff0c;与常见的文字处理软件和演示程序配合使用&#xff0c;能够在各种文档中加入复杂的数学公式和符号&#xff0c;可用在编辑数学试卷、书籍、报刊、论文、幻灯演示等方面&#xff0c;是编辑数学资料的得力工具。MathType与常见文字处理…

【乐吾乐2D可视化组态编辑器】条件变化,触发告警动画

条件触发告警动画 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 如图所示&#xff0c;左侧文本图元数值一直在变化&#xff0c;当数值大于等于50的时候&#xff0c;右侧矩形图元执行告警动画&#xff0c;当数值小于50的时候&#xff0c;右侧图元恢复正常。…

【Spring EL<二>✈️✈️ 】SL 表达式结合 AOP 注解实现鉴权

目录 &#x1f37b;前言 &#x1f378;一、鉴权&#xff08;Authorization&#xff09; &#x1f37a;二、功能实现 2.1 环境准备 2.2 代码实现 2.3 测试接口 &#x1f379;三、测试功能 3.1 传递 admin 请求 ​ 3.2 传递普通 user 请求 &#x1f37b;四、章末 &a…

Arduino 项目:太阳能跟踪器

在本文中&#xff0c;您将逐步学习如何使用 光敏电阻和舵机制作双轴太阳能跟踪器 Arduino 项目。在这个项目中&#xff0c;我们将使用一些光敏传感器来跟踪阳光&#xff0c;并将利用舵机将太阳能电池板引导到可提高其效率的区域。 此项目所需的组件 序号部件名称描述数量备注…