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

news2024/11/16 6:32:50

文章目录

    • 内容简介
    • 网站目录示例
    • 生成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,解决浏览器提示不安全警告

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

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

相关文章

C#——值类型和引用类型的区别详情

值类型和引用类型的区别 值类型 值类型&#xff1a; 常用的基本数据类型都是值类型&#xff1a;bool 、char、int、 double、 float、long 、 byte 、ulong、uint、枚举类型、 结构体类型等特点: 在赋值的过程当中&#xff0c;把值的本身赋值给另一个变量&#xff0c;再修改…

TiKV 源码分析之 PointGet

作者&#xff1a;来自 vivo 互联网存储研发团队-Guo Xiang 本文介绍了TiDB中最基本的PointGet算子在存储层TiKV中的执行流程。 一、背景介绍 TiDB是一款具有HTAP能力(同时支持在线事务处理与在线分析处理 )的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容等重要特…

如何申请小程序SSL证书

在互联网时代&#xff0c;数据安全和用户隐私保护变得尤为重要。SSL证书作为网站、应用或小程序与用户之间建立安全连接的关键工具&#xff0c;其重要性不言而喻。SSL证书能够加密数据传输&#xff0c;防止信息被窃取&#xff0c;提升用户信任度&#xff0c;对于小程序开发者来…

Python自动化

python操作excel # 安装第三个库 cmd -> pip install xlrb 出现success即安装成功 # 导入库函数 import xlrb # 打开的文件保存为excel文档对象 xlsx xlrb.open_workbook("文件位置") # C:\Users\Adminstator\Desktop\学生版.xlsx # 操作工作簿里的工作表 # 1.…

ICRA 2024:基于视觉触觉传感器的物体表⾯分类的Sim2Real双层适应⽅法

⼈们通常通过视觉来感知物体表⾯的性质&#xff0c;但有时需要通过触觉信息来补充或替代视觉信息。在机器⼈感知物体属性⽅⾯&#xff0c;基于视觉的触觉传感器是⽬前的最新技术&#xff0c;因为它们可以产⽣与表⾯接触的⾼分辨率 RGB 触觉图像。然⽽&#xff0c;这些图像需要⼤…

113个大自然声音助眠纯音乐白噪音数据包

今天这一个数据包内置很多简单好听助眠纯音乐歌曲素材&#xff0c;可以帮助用户更好进行大自然声音聆听&#xff0c;带来更多简单舒适睡眠纯音乐环境&#xff0c;享受更多独特音乐听曲放松方式&#xff0c;帮助用户更好听歌助眠&#xff0c;获取更多好的睡眠环境以及质量&#…

Github 2024-06-13开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Shell项目1TypeScript项目1Swift项目1PHP项目1Blade项目1JavaScript项目1从零开始构建你喜爱的技术 创建周期:2156…

免费开源 GIF 录屏制作软件 | ScreenToGif的安装及使用说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;软件教程专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 免费开源 GIF 录屏制作软件 | ScreenToGif的安装及使用说明 文章目…

Java学习之-SpringAI

文章目录 一、SpringAI是什么二、准备工作1.GPT-API-free2.AiCore3.eylink 三、对话案例实现1.创建项目2.实现简单的对话 四、聊天客户端ChatClient1.角色预设2.流式响应 五、聊天模型六、图像模型(文生图)七、语音模型1.文字转语音(文生语音)2.语音转文字 八、多模态九、函数调…

Kubernetes架构详解

Kubernetes架构详解 KubernetsKubernetes架构Kubernetes主节点组件Kubernetes工作节点组件 Kubernetes是云原生非常核心的组件&#xff0c;是云计算的未来&#xff0c;也是大厂经常考察的内容&#xff0c;下面我们就全面来讲解Kubernetes架构 Kubernets Kubernets是Google开发…

超简单理解上拉电阻(高中物理)

上拉电阻的作用 一、增强电路驱动能力二、将不确定的信号钳位在高电平 一、增强电路驱动能力 单片机一个引脚输出5V 当接了一个100Ω电阻之后电压变小 此时接上一个上拉电阻&#xff0c;电压又变高了&#xff0c;提升了电路的驱动能力&#xff0c;本来是并联分压&#xff1…

17.路由配置与页面创建

路由配置与页面创建 官网&#xff1a;https://router.vuejs.org/zh/ Vue Router 和 组合式 API | Vue Router (vuejs.org) 1. 修改index.ts import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router"; import Layout from /layout/Index.vueco…

【数组】【双指针】【练习】最接近的三数之和+四数之和

这篇博客主要是对上篇【数组】【双指针】三数之和做一个练习&#xff0c;包括俩相似题目&#xff1a;最接近的三数之和、四数之和 最接近的三数之和 该题对应力扣地址 有了前车之鉴&#xff0c;直接用双指针写的&#xff0c;没看题解&#xff0c;题解可能有更优化的方法&#…

Spring AI 接入OpenAI实现文字生成图片功能

Spring AI 框架集成的图片大模型 2022年出现的三款文生图的现象级产品&#xff0c;DALL-E、Stable Diffusion、Midjourney。 OpenAI dall-e-3dall-e-2 Auzre OpenAI dall-e-3dall-e-2 Stability stable-diffusion-v1-6 ZhiPuAI cogview-3 OpenAI 与 Auzer OpenAI 使用的图片…

商务风格可视化插图怎么绘制?一行代码搞定~~

上期推文推出使用极少代码绘制顶级期刊要求的学术图表(一行代码绘制符合)后&#xff0c;有小伙伴就问了&#xff0c;有没有可以使用较少代码绘制偏商业风的技巧分享&#xff1f;还别说&#xff0c;我还真有这样的技巧准备分享给爱学习的你们&#xff01;话不多说&#xff0c;咱…

基于MATLAB仿真的BCC卷积码维特比译码算法

&#x1f9d1;&#x1f3fb;个人简介&#xff1a;具有3年工作经验&#xff0c;擅长通信算法的MATLAB仿真和FPGA实现。代码事宜&#xff0c;私信博主&#xff0c;程序定制、设计指导。 &#x1f680;基于MATLAB仿真的BCC卷积码维特比译码算法 目录 &#x1f680;1.BCC卷积码概…

182.二叉树:二叉搜索树的最小绝对差(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

【代码随想录】【算法训练营】【第30天 1】 [322]重新安排行程 [51]N皇后

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 30&#xff0c;周四&#xff0c;好难&#xff0c;会不了一点~ 题目详情 [322] 重新安排行程 题目描述 322 重新安排行程 解题思路 前提&#xff1a;…… 思路&#xff1a;回溯。 重点&…

transformer和Non-local

两者本质上是一个东西&#xff0c;都是用来求自注意力的&#xff0c;但具体而言还是有一些差别&#xff1b; 1&#xff1a;首先说Non-local&#xff0c;它是像素级别的self-attention,算的是图片中各个像素点对指定像素点的影响&#xff1b; 2&#xff1a;transformer我们拿s…

JVM产生FullGC的原因有哪些?

JVM产生FullGC的原因有哪些&#xff1f; 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾回收&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;是一个非常重要的机制。GC的目的是自动管理内存&#xff0c;回收不再使用的对象&#xff0c;防止内存泄…