基于flask的网站如何使用https加密通信-问题记录

文章目录

  • 项目场景:
  • 问题1
    • 问题描述
    • 原因分析
    • 解决步骤
    • 解决方案
  • 问题2
    • 问题描述
    • 原因分析
    • 解决方案
  • 参考文章

在这里插入图片描述

项目场景:

项目场景:基于flask的网站使用https加密通信一文中遇到的问题记录


问题1

问题描述

使用下面的命令生成自签名的SSL/TLS证书和私钥

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem
  • openssl: 这是调用OpenSSL程序的命令。
  • req: 这是OpenSSL的请求(certificate request)命令,用于生成证书请求或自签名证书。
  • -new: 这个选项告诉OpenSSL创建一个新的证书请求或证书。
  • -x509: 这个选项指示OpenSSL生成一个X.509格式的证书。
  • -days 365: 这个选项设置证书的有效期为365天。
  • -nodes: 这个选项指定在生成私钥时不使用密码,即生成的私钥不会被加密。
  • -out cert.pem: 这个选项指定生成的证书文件的名称和路径,这里是cert.pem
  • -keyout key.pem: 这个选项指定生成的私钥文件的名称和路径,这里是key.pem

执行这个命令后,得到两个文件:cert.pem(证书文件)和key.pem(私钥文件)。这些文件可以用于配置Web服务器或其他需要SSL/TLS证书的服务。

这种方式生成的证书无法被浏览器信任,会在浏览器中产生安全警告, 即使在本地windows系统安装cert.pem证书后, 仍然提示不安全

在这里插入图片描述


原因分析

  • 原因未知

解决步骤

  • 浏览器安装证书文件后仍然发出安全提示
  • 升级openssl后重新生成证书和私钥, 仍然发出安全提示
    • 查看openssl版本 , 版本有点老, 于是决定升级为1.1.1k
      [root@centos~]# openssl version 
      OpenSSl 1.0.2k-fips	26 Jan 2017
      
    • openssl 升级命令
      # 步骤 1: 下载 OpenSSL 1.1.1k
      wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
      # 步骤 2: 解压源代码
      tar -zxvf openssl-1.1.1k.tar.gz
      # 步骤 3: 编译并安装
      cd openssl-1.1.1k
      ./config --prefix=/usr/local/openssl --openssldir=/usr/local/ssl shared zlib
      make
      sudo make install
      # 步骤 4: 首先备份旧版本的OpenSSL,然后创建软链接
      mv /usr/bin/openssl /usr/bin/openssl.bak
      sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
      sudo ln -s /usr/local/openssl/include/openssl /usr/include/openssl
      # 更新动态链接库
      sudo echo "/usr/local/openssl/lib" | sudo tee -a /etc/ld.so.conf
      sudo ldconfig
      # 验证新版本
      openssl version
      
  • 生成CA证书, 通过CA证书生成网站证书, 仍然发出安全提示
    • OpenSSL生成CA证书的步骤
      #  步骤 1: 生成私钥, 使用以下命令生成CA的私钥。建议使用2048位或更高位数以确保安全性。
      openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:2048
      # 步骤 2: 创建自签名CA证书:
      # 使用私钥生成一个自签名的CA证书。你需要提供证书有效期、组织信息等。
      openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
      -subj "/C=US/ST=YourState/L=YourCity/O=YourOrganization/CN=YourCommonName"
      # 验证CA证书, 使用以下命令检查生成的CA证书是否正确:
      openssl x509 -in ca.crt -noout -text
      
    • CA证书生成网站服务器证书步骤
      # 如果你需要生成服务器证书,并由CA签名,你可以创建一个CSR,然后使用CA的私钥来签发证书:
      # 步骤 1:生成服务器的私钥
      openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
      # 步骤 2: 创建CSR
      openssl req -new -key server.key -out server.csr \
      -subj "/C=US/ST=YourState/L=YourCity/O=YourOrganization/CN=YourServerName"
      # 步骤 3:使用CA的私钥和证书签发证书
      openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
      -out server.crt -days 365 -sha256
      # 验证签发的证书, 使用以下命令检查签发的证书是否正确:
      openssl x509 -in server.crt -noout -text
      

解决方案

  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
      
    • 生成 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
  2. 方案二

    使用mkcert命令。

    • 安装mkcert
      # 根据自己的系统,下载最新的二进制文件
      wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
      # 二进制文件添加可执行权限,并移动到 $PATH 中
      chmod +x mkcert
      mv mkcert /usr/local/bin/
      # 查看版本
      mkcert -version
      
    • 生成根证书
      mkcert -install
      
    • 生成服务器证书
      mkcert myflaskapp.com
      
    • PC安装根证书
      # 查看根证书位置
      mkcert -CAROOT
      /root/.local/share/mkcert
      
      /root/.local/share/mkcert中有两个文件:rootCA-key.pemrootCA.pem。将 rootCA.pem 复制到 PC 上,并将其后缀改为 .crt。双击安装即可,注意选择受信任的根证书颁发机构

问题2

问题描述

  • Nginx反向代理, PC浏览器无法访问网站。 配置文件 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://127.0.0.1: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;}
    }
    

原因分析

  • nginx使用的是docker启动, proxy_pass http://127.0.0.1:5000 代理地址配置的容器的地址, 而容器内并没有web服务,所以代理没有成功

解决方案

  • 在 Nginx 配置文件 myflaskapp/nginx/myflaskapp.conf 中将 proxy_pass http://127.0.0.1:5000 代理地址的IP修改为宿主机IPproxy_pass http://<your-host-ip>:5000 即可。

参考文章

  • CentOS7.9下升级OpenSSL到OpenSSL 1.1.1k
  • 一个一键即可生成SSL证书的工具,零配置,从此告别繁琐,Star 46K+!
  • mkcert 使用指南:如何快速创建自签名 SSL 证书

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

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

相关文章

Docker镜像技术剖析

目录 1、概述1.1 什么是镜像&#xff1f;1.2 联合文件系统UnionFS1.3 bootfs和rootfs1.4 镜像结构1.5 镜像的主要技术特点1.5.1 镜像分层技术1.5.2 写时复制(copy-on-write)策略1.5.3 内容寻址存储(content-addressable storage)机制1.5.4 联合挂载(union mount)技术 2.机制原理…

用PHP来调用API给自己定制一个“每日新闻”

头条新闻汇聚了互联网上的时事动态&#xff0c;提供最新新闻动态、网络热门话题和视频更新等&#xff0c;覆盖社会、政治、体育、经济、娱乐、科技等多个领域&#xff0c;并不断刷新内容。企业应用这一接口后&#xff0c;可以快速吸引更多的用户访问自己的平台。即使是非新闻类…

有趣的傅里叶变换与小波变换对比(Python)

不严谨的说&#xff0c;时域和频域分析就是在不同的空间看待问题的&#xff0c;不同空间所对应的原子(基函数)是不同的。你想一下时域空间的基函数是什么&#xff1f;频域空间的基函数是什么&#xff1f;一般的时-频联合域空间的基函数是什么&#xff1f;小波域空间的基函数是什…

摄影师在人工智能竞赛中与机器较量并获胜

摄影师在人工智能竞赛中与机器较量并获胜 自从生成式人工智能出现以来&#xff0c;由来已久的人机大战显然呈现出一边倒的态势。但是有一位摄影师&#xff0c;一心想证明用人眼拍摄的照片是有道理的&#xff0c;他向算法驱动的竞争对手发起了挑战&#xff0c;并取得了胜利。 迈…

代码随想录第29天|贪心算法part3

134.加油站 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈 每个加油站的剩余量rest[i]为gas[i] - cost[i] 从0开始累加rest[i]&#xff0c;和记为curSum&#xff0c;一旦curSum小于零&#xff0c;说明[0, i]区间都不能作为起始位置 因为我们一直维护的是一个剩余量大…

HCIA11 网络安全之本地 AAA 配置实验

AAA 提供 Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和 Accounting&#xff08;计费&#xff09;三种安全功能。 • 认证&#xff1a;验证用户是否可以获得网络访问权。 • 授权&#xff1a;授权用户可以使用哪些服务。 •…

机器学习中的监督学习介绍

In this post well go into the concept of supervised learning, the requirements for machines to learn, and the process of learning and enhancing prediction accuracy. 在这篇文章中&#xff0c;我们将深入探讨监督学习的概念、机器学习的要求以及学习和提高预测准确…

归纳贪心好题

很有趣的一道归纳贪心题目 class Solution { public:int minimumAddedCoins(vector<int>& coins, int target) {sort(coins.begin(),coins.end());int n coins.size();int s 0,i0;int res 0;while(s<target){if(i<n&&coins[i]<s1)scoins[i];els…

顶顶通呼叫中心中间件-限制最大通话时间(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-限制最大通话时间(mod_cti基于FreeSWITCH) 一、最大通话时间 1、配置拨号方案 1、点击拨号方案 ->2、在框中输入通话最大时长->3、点击添加->4、根据图中配置->5、勾选continue。修改拨号方案需要等待一分钟即可生效 action"sched…

9M高速USB转接芯片CH347转双串口转I2C转SPI转JTAG转SWD

1、概述 CH347 TSSOP20封装和丝印 CH347 是一款高速 USB 总线转接芯片&#xff0c;通过 USB 总线提供异步串口、I2C 同步串行接口、SPI 同步串行接口和 JTAG 接口等。 在异步串口方式下&#xff0c;CH347 提供了 2 个高速串口&#xff0c;支持 RS485 串口收发使能控制、硬件流控…

LeetCode | 387.字符串中的第一个唯一字符

这道题可以用字典解决&#xff0c;只需要2次遍历字符串&#xff0c;第一次遍历字符串&#xff0c;记录每个字符出现的次数&#xff0c;第二次返回第一个出现次数为1的字符的下标&#xff0c;若找不到则返回-1 class Solution(object):def firstUniqChar(self, s):""…

Python自动化办公(一) —— 根据PDF文件批量创建Word文档

Python自动化办公&#xff08;一&#xff09; —— 根据PDF文件批量创建Word文档 在日常办公中&#xff0c;我们经常需要根据现有的PDF文件批量创建Word文档。手动操作不仅费时费力&#xff0c;而且容易出错。幸运的是&#xff0c;使用Python可以轻松实现这个过程。本文将介绍如…

linux的repo工具的入门

repo 是一个工具&#xff0c;用于管理 Git 仓库的集合&#xff0c;尤其在 Android 开发中被广泛使用。它是 Google 为 Android 项目开发的&#xff0c;以简化对大量 Git 仓库的管理。 主要特点 多仓库管理&#xff1a;repo 允许同时管理多个 Git 仓库&#xff0c;可以轻松执行…

MyBatis 的多级缓存机制是怎么样运作的?

引言&#xff1a;上周三&#xff0c;小 X 去面试一家中厂&#xff0c;其中面试官问到 MyBatis 的多级缓存机制是怎么样运行的&#xff1f;这个问题可以好好准备一下&#xff0c;很多人可能只会用 MyBatisPlus&#xff0c;简单的多表联查 SQL 语句可能都写不出来&#xff0c;更别…

Python 项目应该放弃requirements.txt?揭秘PDM的强大功能

目录 requirements.txt的局限性 PDM 的优势 如何使用 PDM 安装 PDM 初始化项目 添加依赖 管理依赖 示例代码 初始化项目并添加依赖 编写简单的 Flask 应用 运行应用 PDM高级功能 多环境管理 脚本管理 发布包 在 Python 项目中管理依赖项&#xff0c;最常见的方式…

Android APP memory统计方法

目录 进程的内存信息概述 关键的术语 测试步骤 测试步骤 数据处理 数据分析&#xff1a; 进程内存信息 Dumpsys meminfo -a PID Procrank Procmem PID 特殊内存信息 Mali ION(multi-media&#xff0c;gralloc) 进程地址空间信息 /proc/pid/smaps Showmap PID …

随笔-来了,安了

依照领导定的规矩&#xff0c;周五又去了分公司&#xff0c;赋能一线去了。到了地方就是开会->现场解决问题->干饭->开会过需求、提供解决方案&#xff0c;充实得厉害。强度也不小&#xff0c;中午干的一大碗饭&#xff0c;到五点就饿了。 六点带着分公司催着上线的需…

5000天后的世界

为何可以预见未来 1993年&#xff0c;在互联网的黎明时代&#xff0c;凯文凯利创办了《连线》杂志。他曾经采访过以比尔盖茨、史蒂夫乔布斯、杰夫贝佐斯为代表的一众风云创业家。《连线》杂志是全球发行的世界著名杂志&#xff0c;一直致力于报道科学技术带来的经济、社会变革…

【0基础学爬虫】爬虫基础之自动化工具 DrissionPage 的使用

概述 前三期文章中已经介绍到了 Selenium 与 Playwright 、Pyppeteer 的使用方法&#xff0c;它们的功能都非常强大。而本期要讲的 DrissionPage 更为独特&#xff0c;强大&#xff0c;而且使用更为方便&#xff0c;目前检测少&#xff0c;强烈推荐&#xff01;&#xff01;&a…

Google Earth Engine(GEE)——计算闪闪红星的ndvi的值和折线图(时序分析)

函数: ui.Chart.image.doySeries(imageCollection, region, regionReducer, scale, yearReducer, startDay, endDay)