文章目录
- 项目场景:
- 问题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
- 查看openssl版本 , 版本有点老, 于是决定升级为
- 生成
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
- OpenSSL生成CA证书的步骤
解决方案
-
方案一
- 配置文件
在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
。
- 配置文件
-
方案二
使用
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.pem
和rootCA.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 证书