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


    在这里插入图片描述

    项目场景:

    项目场景:基于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             = 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 来生成自签名的证书, 如下所示:
        # 定义文件名称
        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://:5000 即可。

    参考文章

  • 相关阅读:
    传奇M数据目录
    论文阅读NAM:Normalization-based Attention Module
    【会议分享】2022年第四届大数据、物联网与计算国际会议(ICBICC 2022)
    Vulnhub Me-and-My-Girlfriend
    webpack不同环境下使用CSS分离插件mini-css-extract-plugin
    CentOS7.6升级内核到5.11及build RPM包
    docker本地容器化部署项目
    秋招升级打怪拿 offer,10w+ 字总结的 Java 面试题
    基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现
    C语言系统化精讲(四):C语言变量和数据类型-下篇
  • 原文地址:https://blog.csdn.net/weixin_44585288/article/details/139666506