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

文章目录

项目场景:

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


问题1

问题描述

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

sh 复制代码
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

      sh 复制代码
      [root@centos~]# openssl version 
      OpenSSl 1.0.2k-fips	26 Jan 2017
    • openssl 升级命令

      sh 复制代码
      # 步骤 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证书的步骤

      sh 复制代码
      #  步骤 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证书生成网站服务器证书步骤

      sh 复制代码
      # 如果你需要生成服务器证书,并由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, 增加下面配置信息

      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
    • 生成 SSL 证书和私钥:
      我们还需要一个 SSL 证书和私钥, 基于配置文件,使用 OpenSSL 来生成自签名的证书, 如下所示:

      bash 复制代码
      # 定义文件名称
      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

      sh 复制代码
      # 根据自己的系统,下载最新的二进制文件
      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
    • 生成根证书

      sh 复制代码
      mkcert -install
    • 生成服务器证书

      sh 复制代码
      mkcert myflaskapp.com
    • PC安装根证书

      sh 复制代码
      # 查看根证书位置
      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 中设置反向代理规则如下:

    nginx 复制代码
    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 即可。

参考文章

相关推荐
数据智能老司机19 分钟前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i2 小时前
drf初步梳理
python·django
每日AI新事件2 小时前
python的异步函数
python
这里有鱼汤3 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook12 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室12 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三14 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试