基于flask的网站如何使用https加密通信
文章目录
- 内容简介
- 网站目录示例
- 生成SSL证书
- 单独使用Flask
- 使用WSGI服务器
- Nginx反向代理
- 参考资料
内容简介
HTTPS 是一种至关重要的网络安全协议,它通过在 HTTP 协议之上添加 SSL/TLS 层来确保数据传输的安全性和完整性。这有助于防止数据在客户端和服务器之间传输时被窃听、篡改或伪造,对于保护用户隐私、防范中间人攻击以及增强用户对网站的信任至关重要。
针对 Flask Web 应用,实现 HTTPS 加密的三种推荐方式如下:
-
直接使用 Flask 启动 HTTPS:
- 优势:配置过程简单直观,非常适合开发和测试阶段。
- 局限:在高流量的生产环境中,其性能可能不足以应对需求;自签名证书可能会触发浏览器安全警告,影响用户体验。
- 实施方法:通过 Flask 应用直接配置 SSL/TLS,并在 443 端口上监听,实现 HTTPS 加密。
-
利用 WSGI 服务器(例如 Gunicorn):
- 优势:相较于 Flask 原生运行,WSGI 服务器能更高效地处理请求,支持生产环境中所需的高级特性,如工作进程和线程的智能管理。
- 局限:配置过程相对复杂,需要对服务器进行额外的管理和配置。
- 实施方法:使用 Gunicorn 等 WSGI 服务器运行 Flask 应用,并设置 SSL/TLS,以提升性能和可扩展性。
-
部署 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证书
- 配置文件:
在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
- 生成 SSL 证书和私钥:
我们还需要一个 SSL 证书和私钥, 基于配置文件,使用 OpenSSL 来生成自签名的证书, 如下所示:
这将生成一个有效期为 3600 天的自签名证书# 定义文件名称 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
myflaskapp.com.crt
和私钥myflaskapp.com.key
。
单独使用Flask
使用 Flask 搭建一个简单的网站并启用 HTTPS 可以通过以下步骤完成:
-
安装 Flask:
首先,确保你已经安装了Python3
,然后使用pip3
来安装Flask
库:pip3 install flask
-
创建 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。
-
启动 Flask 应用:
在命令行中运行以下命令来启动你的 Flask 应用:python3 main.py
-
配置域名映射:
将你的 Flask 应用的宿主机IP地址
映射到域名myflaskapp.com
。对于windows用户可以在C:\Windows\System32\drivers\etc
文件夹下的host
文件增加下面内容:<your-host-ip> myflaskapp.com
-
浏览器访问:
在浏览器中输入https://myflaskapp.com
访问你的网站。请注意,使用自签名证书会在浏览器中产生安全警告,因为自签名证书不被浏览器信任。 -
安装证书:
- 对于 Windows 用户,可以从服务器导出证书
myflaskapp.com.crt
,通过双击证书文件并按照提示安装。证书安装在受信任的根证书颁发机构
目录下。
- 安装完成后,重启浏览器,能够安全访问你的网站。
- 对于 Windows 用户,可以从服务器导出证书
请注意,使用自签名证书在生产环境中是不推荐的,因为它不被浏览器信任。在实际部署时,应该使用由受信任的证书颁发机构签发的证书。此外,确保你的 SSL 证书和私钥文件路径正确无误,并且具有正确的权限设置。
使用WSGI服务器
在生产环境中部署 Flask 应用时,使用 WSGI 服务器如 Gunicorn 可以提供更好的性能和稳定性。以下是使用 Gunicorn 部署 Flask 应用的步骤,包括一些优化的描述:
-
安装 Gunicorn:
使用pip3
安装Gunicorn
,这是Python
的一个WSGI HTTP
服务器,用于生产环境, 如下:pip3 install gunicorn
-
创建启动脚本:
在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 应用的模块和应用变量的引用。
-
启动 Gunicorn 服务:
给脚本文件添加执行权限,并运行它来启动 Gunicorn 服务:chmod +x start_gunicorn.sh ./start_gunicorn.sh
这样,你的 Flask 应用就会以 Gunicorn 作为 WSGI 服务器在后台运行。
-
浏览器访问:
在浏览器中输入https://myflaskapp.com
来访问你的网站。由于使用了 SSL/TLS 证书,你的连接将是加密的,浏览器会显示安全连接。
Nginx反向代理
部署 Flask 应用到生产环境时,使用 Nginx 作为反向代理服务器不仅可以提高应用的性能,还可以增强安全性。以下是使用 Nginx 和 Gunicorn 部署 Flask 应用的步骤:
-
拉取 Nginx 镜像:
使用 Docker 拉取最新的 Nginx 镜像:docker pull nginx
-
修改 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()
-
修改 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 &
-
配置 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
地址。 -
创建 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
-
启动服务:
首先启动 Gunicorn 服务,然后启动 Nginx 服务:./start_gunicorn.sh ./start_nginx.sh
-
浏览器访问:
在浏览器中输入https://myflaskapp.com
访问你的网站。由于 Nginx 配置了 SSL 证书,连接将是安全的,浏览器将显示安全连接。
参考资料
如何制作和使用自签名证书
自签证书让Chrome信任的方式
使用自签名SSL证书配置HTTPS,解决浏览器提示不安全警告
相关文章:

基于flask的网站如何使用https加密通信
文章目录 内容简介网站目录示例生成SSL证书单独使用Flask使用WSGI服务器Nginx反向代理参考资料 内容简介 HTTPS 是一种至关重要的网络安全协议,它通过在 HTTP 协议之上添加 SSL/TLS 层来确保数据传输的安全性和完整性。这有助于防止数据在客户端和服务器之间传输时…...

软件测试面试题(应届生)
设计员工管理系统的测试用例时,需要考虑系统的各种功能和可能的使用场景,以确保系统的稳定性和准确性。以下是一些设计测试用例的基本步骤和策略: 一、明确测试目标 首先,需要明确测试的目标,例如确保员工信息的准确…...

使用halo的jar方法搭建博客(数据库mysql
ssh连接远程主机 ➜ ~ ssh root 146.56.249.61 第一步.在CentOS 7上安装下载OpenJDK 17的tar.gz文件 wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz解压 tar xvf openjdk-17.0.1_linux-…...

Linux - 复盘一次句柄数引发的故障
文章目录 Pre(内核、用户、进程)句柄数设置问题 shell修复 Pre Linux - 深入理解/proc虚拟文件系统:从基础到高级 (内核、用户、进程)句柄数设置 在Linux系统中,进程打开的最大句柄数可以通过多种方式配置…...

2024/06/13--代码随想录算法2/17| 62.不同路径、63. 不同路径 II、343. 整数拆分 (可跳过)、96.不同的二叉搜索树 (可跳过)
62.不同路径 力扣链接 动态规划5步曲 确定dp数组(dp table)以及下标的含义: dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。确定递推公式,dp[i][j] d…...

Android低代码开发 - 直接创建一个下拉刷新列表界面
看了我Android低代码开发 - 让IDE帮你写代码这篇文章的小伙伴,大概都对Dora全家桶开发框架有基本的认识了吧。本篇文章将会讲解如何使用dora-studio-plugin快捷创建一个下拉刷新列表界面。 效果演示 这样直接通过图形界面的方式就创建好了下拉刷新上拉加载空态界面…...

23.Dropout
在深度学习的训练过程中,过拟合是一个常见的问题。为了解决这个问题,研究者们提出了多种正则化技术,其中Dropout技术因其简单而有效的特点,得到了广泛的应用。本文将对Dropout技术的工作原理、主要优点、潜在缺点以及应用场景进行…...

电脑撤回的快捷键是什么?
下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍,在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”,用于取消上一步操作,对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…...

每日一题——Python实现PAT甲级1116 Come on! Let‘s C(举一反三+思想解读+逐步优化)五千字好文
一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 我要更强 优化思路 优化…...

spring-data-mongodb版本兼容问题
spring-data-mongodb与mongodb驱动有兼容性问题,不匹配会报NoSuchMethod异常,mongodb的java驱动包在4.0之后由mongodb-java-driver更名为mongodb-driver-sync。 spring-data-mongodb包依赖中有mongodb-driver-core,但缺诸如MongoCollection等…...

Java的核心类库
引言 在Java编程中,熟练掌握常用类与对象操作是开发的基础。Java的核心类库提供了丰富的功能,可以帮助开发者高效地处理各种编程任务。本文将详细介绍Java字符串操作、集合框架、日期与时间处理等内容,并通过图表和表格进行总结与示范。 字符…...

NSS题目练习9
[极客大挑战 2020]welcome 界面打开后一片空白,查看题目描述,翻译过来是 1.除了GET请求方法,还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo,你会发现标志在哪里。 补充: sh…...

JS 【算法】二分查找
使用场景 在有序数组中查找目标元素 const arr [1, 2, 3, 4, 5, 6, 7, 8, 9] const target 2 console.log(binarySearch1(arr, target)) console.log(binarySearch2(arr, target))循环实现 function binarySearch1(arr, target) {const length arr.lengthif (length 0) re…...

前端工程化工具系列(十四)—— Webpack(v5.91.0):应用模块打包器与构建工具
Webpack 是用于现代 JavaScript 应用程序的静态模块打包器。 当 webpack 处理应用程序时,它会在内部构建一个依赖关系图,该图映射项目所需的每个模块最终会生成一个或多个包。 1 概念 1.1 modules Webpack 中,无论是 JS 、CSS 还是图片等&…...

ThinkPHP+Bootstrap简约自适应网址导航网站源码
使用 ThinkPHPbootstrap 开发,后台采用全局 ajax 无刷新加载,前后台自适应,前台页面非常简洁适合自己收藏网站或做导航网站。 搭建教程: 1.整个主机 2.绑定解析域名 3.上传源码,解压 把解压出来的 nav.sql 文件导入数…...

Flutter 使用ffigen生成ffmpeg的dart接口
Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频 第七章 使用ff…...

(message): No CUDA toolset found.
解决方法: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\visual_studio_integration\MSBuildExtensions\ 下的4个文件 复制到 D:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\BuildCustomizations\下。…...

【python】邮箱正则验证
当然可以。以下是一个使用Python正则表达式的例子,用于检查一个字符串是否是一个有效的电子邮件地址: import re def is_valid_email(email):regex r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$return bool(re.match(regex, email)) # 测试电子邮件…...

深度学习(四)——torchvision中数据集的使用
1. 参数详解 torchvision中每个数据集的参数都是大同小异的,这里只介绍CIFAR10数据集 该数据集的数据格式为PIL格式 class torchvision.datasets.CIFAR10(root:str,train:boolTrue,transform:Optional[Callable]None,target_transform:Optional[Callable]None,do…...

【全开源】图书借阅管理系统源码(ThinkPHP+FastAdmin)
📚图书借阅管理系统:打造你的私人图书馆 一款基于ThinkPHPFastAdmin开发的简易图书借阅管理系统,一款轻量级的图书借阅管理系统,具有会员管理,图书管理,借阅及归还管理,会员充值等基本功能&…...

Mysql中使用where 1=1有什么问题吗
昨天偶然看见一篇文章,提到说如果在mysql查询语句中,使用where 11会有性能问题?? 这着实把我吸引了,因为我项目中就有不少同事,包括我自己也有这样写的。为了不给其他人挖坑,赶紧学习一下&…...

中心极限定理的MATLAB例
独立同分布的中心极限定理: 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1,X2,…,Xn 是独立同分布的随机变量序列,且 E ( X i ) μ E(X_i) \mu E(Xi)μ, D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi)σ2>0&a…...

定义input_password函数,提示用户输入密码.如果用户输入长度<8,抛出异常,如果用户输入长度>=8,返回输入的密码
def input_password(password):str1passwordlen1len(str1)try:if len1<8:raise ValueError("密码长度不能小于8")else:return print(f"你的密码为:{password},请确认")except ValueError as e:print(f":Error is {e}")number1input("请…...

【深度学习】IP-Adapter 和 InstantID 的核心机制比较
IP-Adapter 和 InstantID 是两个在图像生成中具有不同优势和应用场景的模型。以下是这两个模型的区别及其理论分析。 IP-Adapter 特点: 图像提示能力: IP-Adapter 通过引入图像提示能力,使得预训练的文本到图像扩散模型可以接受图像作为提示,从而生成…...

JEPaaS 低代码平台 j_spring_security_check SQL注入漏洞复现
0x01 产品简介 JEPaaS是一款优秀的软件平台产品,可视化开发环境,低代码拖拽式配置开发,操作极其简单,可以帮助解决Java项目80%的重复工作,让开发更多关注业务逻辑,大大提高开发效率,能帮助公司大幅节省人力成本和时间成本,同时又不失灵活性。适用于搭建 OA、ERP、CRM、…...

天锐绿盾 | 无感知加密软件、透明加密系统、数据防泄漏软件
摘要:文件加密软件,包含禁止非授权的文件泄密和抄袭复制解决方案即使被复制泄密都是自动加密无法阅读,透明加密,反复制软件,内网监控,文件加密,网络安全方案,透明文件加密,加密文件,图纸加密,知识产权保护,加密数据; 通过绿盾信息安全管理软件,系统在不改…...

kubernetes(k8s)集群部署(2)
目录 k8s集群类型 k8s集群规划: 1.基础环境准备: (1)保证可以连接外网 (2)关闭禁用防火墙和selinux (3)同步阿里云服务器时间(达到集群之间时间同步) &…...

Git操作指南
1、提交代码操作 拉取线上分支,防止本地代码提交冲突 git pull origin dev git add . git commit -m “给本次提交添加注释” git push origin dev 2、打分支并切换分支 git checkout -b 新建并切换到新分支 切换到主分支 git checkout main git merge dev git p…...

全域推广和标准推广哪个更好。谁更容易获客?
随着全域概念的兴起,全域推广逐渐走进人们视野,并成为新的互联网热词。在此背景下,与全域推广相关的话题,如全域推广是什么及全域推广和标准推广的区别等成为了许多创业者讨论和搜索的对象。 所谓的全域推广,简单来说…...

首张地下地图!D-Wave 专用量子计算机助力沙特阿美完成地震成像
内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨沛贤 深度好文:800字丨3分钟阅读 摘要:过去两年中,沙特阿美研究中心一直在使用总部在加拿大的D-Wave 公司的专用量子计算技术,…...