深入理解HTTPS:从概念到实战优化

    • 一:概述
    • 二:工作流程
    • 三:创建自签名证书
    • 四:案例
      • 1)案例一:HTTPS 搭建
      • 2)案例二:HTTP/2 搭建
      • 3)案例三:HTTP 重定向 HTTPS
      • 4)案例四:网站集群 HTTPS 配置
    • 五:优化
    • 六:监控
      • 1)监控思路
      • 2)监控方式
      • 3)监控脚本
  • 总结

🌟 如果你对 HTTP 协议的基础知识(如请求/响应报文、状态码等)还不熟悉,建议先阅读:《HTTP协议完全指南:从报文到状态码》

一:概述

HTTPS = HTTP + TLS/SSL

在 HTTP 的基础上,HTTPS 增加了加密和身份验证,保障数据传输的安全性。

主要作用:

  1. 加密通信:防止数据在传输过程中被窃取或篡改
  2. 身份验证:确认服务器身份,防止钓鱼或中间人攻击
  3. 数据完整性:确保数据在传输过程中未被修改

二:工作流程

HTTPS 基于 TLS(传输层安全协议),核心流程如下:

  1. 客户端发起 HTTPS 请求
    • 浏览器访问 https://example.com
    • 告诉服务器它支持的TLS版本和加密算法 + 一个随机数
  2. 服务器返回证书
    • 证书中包含公钥、域名、颁发机构等信息 + 一个随机数
  3. 客户端验证证书
    • 检查证书是否可信(CA 签名、有效期、域名匹配)
  4. 生成会话密钥
    • 生成一个预密钥,然后用服务器的公钥加密后发给服务器,服务器用密钥解密,然后将预密钥和两个随机数组成对称密钥
  5. 加密通信
    • 后续所有 HTTP 请求和响应 都用对称密钥加密传输

三:创建自签名证书

  • .key:私钥

  • .csr:申请证书的文件,交给CA(如果指定为自签名证书 -x509 则不生成)

  • .crt:公钥 + 证书

  • .pem:公钥 + 证书

  • 一步到位

    openssl req -days 365 -x509 -sha256 -nodes -newkey rsa:2048 \
    -keyout server.key -out server.crt
    
  • 分两步

    1. 创建私钥

      openssl genrsa -out server.key 2048
      
    2. 根据私钥生成证书

      • -days:指定证书有效时间(单位:天)
      • -x509:直接生成自签名证书(不用额外 CSR
      • -sha256:签名算法
      • -key:指定已有私钥位置
      • -out:指定输出证书文件位置
      openssl req -days 365 -x509 -sha256 -key server.key -out server.crt
      

四:案例

1)案例一:HTTPS 搭建

  1. 创建存放 SSL 证书和私钥的目录

    [root@web01 ~]# mkdir -p /etc/nginx/ssl_keys
    
  2. 上传证书

    [root@web01 ~]# unzip /opt/software/ssl.jackmk.cn_nginx.zip -d /etc/nginx/ssl_keys/
    
  3. 创建站点

    # 创建站点目录
    [root@web01 ~]# mkdir -p /opt/module/ssl# 创建站点 index.html
    [root@web01 ~]# echo "index" > /opt/module/ssl/index.html
    
  4. 创建站点配置文件

    [root@web01 ~]# vim /etc/nginx/conf.d/ssl.conf
    
    server {listen 443 ssl;# ssl on; # 1.15.0 以后被废弃了server_name ssl.jackmk.cn;root /opt/module/ssl/;# ssl keyssl_certificate /etc/nginx/ssl_keys/ssl.jackmk.cn.pem;ssl_certificate_key /etc/nginx/ssl_keys/ssl.jackmk.cn.key;location / {index index.html;}
    }
    
  5. 刷新 Nginx

    nginx -t
    nginx -s reload
    
  6. 配置 hosts

    192.168.2.104 ssl.jackmk.cn
    
  7. 访问


2)案例二:HTTP/2 搭建

server {listen 443 ssl http2;  # 只要加上这个就行server_name ssl.jackmk.cn;root /opt/module/ssl/;# ssl keyssl_certificate /etc/nginx/ssl_keys/ssl.jackmk.cn.pem;ssl_certificate_key /etc/nginx/ssl_keys/ssl.jackmk.cn.key;location / {index index.html;}
}

3)案例三:HTTP 重定向 HTTPS

  1. 创建存放 SSL 证书和私钥的目录

    [root@web01 ~]# mkdir -p /etc/nginx/ssl_keys
    
  2. 上传证书

    • ssl.jackmk.cn.key:私钥
    • ssl.jackmk.cn.pem:证书 + 公钥
    [root@web01 ~]# unzip /opt/software/ssl.jackmk.cn_nginx.zip -d /etc/nginx/ssl_keys/
    
  3. 创建站点

    # 创建站点目录
    [root@web01 ~]# mkdir -p /opt/module/ssl# 创建站点 index.html
    [root@web01 ~]# echo "index" > /opt/module/ssl/index.html
    
  4. 创建站点配置文件

    [root@web01 ~]# vim /etc/nginx/conf.d/ssl.conf
    
    server {listen 80;server_name ssl.jackmk.cn;return 301 https://ssl.jackmk.cn$request_uri;#rewrite ^(.*)$ https://ssl.jackmk.cn$1 permanent;
    }server {listen 443 ssl;# ssl on; # 1.15.0 以后被废弃了server_name ssl.jackmk.cn;root /opt/module/ssl/;# ssl keyssl_certificate /etc/nginx/ssl_keys/ssl.jackmk.cn.pem;ssl_certificate_key /etc/nginx/ssl_keys/ssl.jackmk.cn.key;location / {index index.html;}
    }
    
  5. 刷新 Nginx

    [root@web01 ~]# nginx -t
    [root@web01 ~]# nginx -s reload
    
  6. 配置 hosts

    192.168.2.104 ssl.jackmk.cn
    
  7. 访问

    此时如果请求 http://ssl.jackmk.cn 会自动跳转至 http://ssl.jackmk.cn
    

4)案例四:网站集群 HTTPS 配置

1)部署 web01web02

  1. 创建存放 SSL 证书和私钥的目录

    mkdir -p /etc/nginx/ssl_keys
    
  2. 创建私钥以及证书

    # 1. 切换目录
    cd /etc/nginx/ssl_keys# 2. 创建私钥
    openssl genrsa -out ssl.key 2048# 3. 创建证书
    openssl req -days 365 -x509 -sha256 -key ssl.key -out ssl.crt
    
  3. 创建站点

    # 创建站点目录
    mkdir -p /opt/module/ssl# 创建站点 index.html
    echo "web01" > /opt/module/ssl/index.html
    or
    echo "web02" > /opt/module/ssl/index.html
    
  4. 创建站点配置文件

    如果是 https -> http 那么就不需要配置 ssl keys

    vim /etc/nginx/conf.d/ssl.conf
    
    server {listen 443 ssl;server_name ssl.cn;root /opt/module/ssl/;# ssl keysssl_certificate /etc/nginx/ssl_keys/ssl.crt;ssl_certificate_key /etc/nginx/ssl_keys/ssl.key;location / {index index.html;}
    }
    
  5. 刷新 Nginx

    nginx -t
    nginx -s reload
    

2)部署 lb01

  1. 创建存放 SSL 证书和私钥的目录

    [root@lb01 ~]# mkdir -p /etc/nginx/ssl_keys
    
  2. 创建私钥以及证书

    # 1. 切换目录
    [root@lb01 ~]# cd /etc/nginx/ssl_keys# 2. 创建私钥
    [root@lb01 ssl_keys]# openssl genrsa -out ssl.key 2048# 3. 创建证书
    [root@lb01 ssl_keys]# openssl req -days 365 -x509 -sha256 -key ssl.key -out ssl.crt
    
  3. 创建配置文件

    [root@lb01 ~]# vim /etc/nginx/conf.d/ssl.conf
    
    upstream ssl_pools {server 192.168.2.104:443;server 192.168.2.105:443;
    }server {listen 80;server_name ssl.cn;return 301 https://ssl.cn$request_uri;
    }server {listen 443 ssl;server_name ssl.cn;# ssl keysssl_certificate /etc/nginx/ssl_keys/ssl.crt;ssl_certificate_key /etc/nginx/ssl_keys/ssl.key;location / {proxy_pass https://ssl_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
    }
    
  4. 刷新 Nginx

    [root@lb01 ~]# nginx -t
    [root@lb01 ~]# nginx -s reload
    
  5. 配置 hosts

    192.168.2.102 ssl.cn
    
  6. 访问

    在这里插入图片描述


五:优化

主要是针对 SSL/TLS 加密连接做了一些安全和性能优化。

  • listen 443 ssl

    • 作用:开启 HTTPS 服务,监听 443 端口,并启用 SSL 模块。(没有这行,就算配了证书也不会启用 HTTPS)
  • keepalive_timeout 70

    • 作用:设置 长连接保持时间为 70 秒。

    • 好处

      • 客户端和服务端之间如果频繁请求(比如网页加载很多小文件),可以复用连接,减少握手开销。

      • 设置过短会导致频繁握手,过长又会占用资源。70s 算是折中优化。

  • ssl_protocols TLSv1 TLSv1.1 TLSv1.2

    • 作用:指定允许使用的 TLS 协议版本。

    • 这里启用了 TLSv1、TLSv1.1、TLSv1.2,但注意:

      • TLSv1 和 TLSv1.1 已过时(安全性差),现代浏览器和安全规范(如 PCI DSS)都建议关闭。
      • 最佳实践是只保留 TLSv1.2+,甚至启用 TLSv1.3(性能更好)
      ssl_protocols TLSv1.2 TLSv1.3;
      
  • ssl_ciphers ...

    • 作用:指定允许使用的加密算法套件。
    • 配置里显式排除了:
      • !aNULL → 禁止匿名算法
      • !eNULL → 禁止无加密算法
      • !EXPORT → 禁止出口级弱加密
      • !DES!RC4!MD5 → 禁止已知不安全的算法
  • ssl_certificate / ssl_certificate_key

    • 作用:指定服务器证书和私钥。
    • cert.pem → 公钥证书
    • cert.key → 对应的私钥
  • ssl_session_cache shared:SSL:10m

    • 作用:配置 SSL 会话缓存。Nginx 在 10MB 的共享内存里存储 SSL 会话信息。
    • 好处
      • 客户端下次访问时可以复用会话,不必重新完整握手(节省 CPU 和握手延迟)。
      • 10MB 大约能缓存 4 万次会话(每个会话约 256B)。
  • ssl_session_timeout 10m

    • 作用:设置 SSL 会话的过期时间(10 分钟)。
    • 好处:在这段时间内,同一个客户端可以复用 TLS 会话,避免再次握手,提高性能。
server {listen 443 ssl;keepalive_timeout 70;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5; ssl_certificate /usr/local/nginx/conf/cert.pem;ssl_certificate_key /usr/local/nginx/conf/cert.key;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;...
}

六:监控

主要针对 HTTPS 证书过期监控方案整理

1)监控思路

  • 通过命令获取证书的过期日期
  • 将证书过期日期与当前日期对比
  • 计算剩余天数(如小于 30 天报警)

2)监控方式

  • 本地证书检查

    • openssl x509:调用 opensslx509 子命令,主要用于 查看、转换、管理 X.509 证书
    • -in :指定输入文件,也就是要读取的证书文件。
    • -noout:默认 openssl x509 会把证书的所有内容(包括公钥、签发者、使用者等)都打印出来。 加了 -noout 表示 不要输出证书本身的 Base64 内容,只输出你后面指定的信息。
    • -dates:输出证书的有效期信息:
    openssl x509 -in /etc/nginx/ssl_keys/ssl.crt -noout -dates
    
    notBefore=Aug 22 16:52:34 2025 GMT  # 证书开始生效的时间
    notAfter=Aug 22 16:52:34 2026 GMT   # 证书过期的时间
    
  • curl 远程监控

    curl -Lv https://www.baidu.com |& grep 'expire date'
    

3)监控脚本

  • 检查单个指定的网站的 HTTPS 证书过期时间

    vim check_https_cert.sh
    chmod 755 check_https_cert.sh
    
    #!/bin/bash#=============================
    # 1. 基础变量
    #    URL: 定义指定的网站
    #    LANG: 临时改为英文环境,避免 date 解析报错
    #=============================
    URL="https://www.jd.com"
    export LANG="en_US.UTF-8"#=============================
    # 2. 获取证书过期时间戳
    #    curl -Lv:显示详细信息并跟随重定向
    #    egrep 'expire date':提取证书过期时间
    #=============================
    EXPIRE_DATE_RAW=$(curl -Lv "${URL}" -o /dev/null 2>&1 | grep -i 'expire date' | awk -F 'date:|GMT' '{print $2}')
    EXPIRE_SECOND=$(date -d "${EXPIRE_DATE_RAW}" +%s)#=============================
    # 3. 获取当前时间戳
    #=============================
    NOW_SECOND=$(date +%s)#=============================
    # 4. 计算剩余天数
    #=============================
    EXPIRE_DAYS=$(( (EXPIRE_SECOND - NOW_SECOND) / 86400 ))#=============================
    # 5. 输出结果
    #=============================
    if [ "${EXPIRE_DAYS}" -le 300 ]; thenecho "[警告] ${URL} 的 HTTPS 证书即将过期,还有 ${EXPIRE_DAYS} 天"
    elseecho "[正常] ${URL} 的 HTTPS 证书还剩 ${EXPIRE_DAYS} 天"
    fi
    
  • 检查多个指定网站的HTTPS 证书过期时间

    vim check_https_cert.sh
    chmod 755 check_https_cert.sh
    
    #!/bin/bash#=============================
    # 1. 基础变量
    #    LANG: 临时改为英文环境,避免 date 解析报错
    #    URLS: 定义要检测的多个网站
    #=============================
    URLS=("https://www.jd.com" "https://www.baidu.com" "https://www.taobao.com")
    export LANG="en_US.UTF-8"#=============================
    # 2. 遍历检测每个 URL 的证书有效期
    #=============================
    for URL in "${URLS[@]}"; do# 2.1 获取证书过期时间(原始格式)EXPIRE_DATE_RAW=$(curl -Lv "${URL}" -o /dev/null 2>&1 | grep -i 'expire date' | awk -F 'date:|GMT' '{print $2}')# 2.2 转换为时间戳EXPIRE_SECOND=$(date -d "${EXPIRE_DATE_RAW}" +%s)# 2.3 当前时间戳NOW_SECOND=$(date +%s)# 2.4 计算剩余天数EXPIRE_DAYS=$(( (EXPIRE_SECOND - NOW_SECOND) / 86400 ))#=============================# 3. 输出结果#=============================if [ "${EXPIRE_DAYS}" -le 300 ]; thenecho "[警告] ${URL} 的 HTTPS 证书即将过期,还有 ${EXPIRE_DAYS} 天"elseecho "[正常] ${URL} 的 HTTPS 证书还剩 ${EXPIRE_DAYS} 天"fi
    done
    

总结

本文从理论到实践,详细阐述了HTTPS如何为HTTP协议提供加密、认证和完整性保护,从而构筑现代Web安全的核心防线。我们不仅剖析了TLS握手的工作流程,动手创建了自签名证书,更通过多个渐进式的实战案例(单点HTTPS/HTTP2、重定向、集群配置)展示了如何在复杂的生产环境中应用它。

  • 💎 核心价值:HTTPS已不再是可选项,而是现代网站的标配。它保护用户隐私、提升网站信誉(浏览器安全标识🔒)、同时也是使用HTTP/2等现代协议的前提条件。

  • ⚙️ 实践意义:本文提供的案例和优化、监控方案,源自于真实的运维场景。正确地配置HTTPS(如选择安全的密码套件、开启HSTS、配置重定向)和建立有效的监控(如证书过期监控),是保障服务稳定性和安全性的关键。

  • 🔮 未来方向:安全是一个持续的过程。TLS协议版本和推荐的加密套件也在不断更新以应对新的威胁。自动化(如使用Let’s Encrypt自动续期证书)和更严格的安全策略(如预加载HSTS)是未来的发展趋势。

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

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

相关文章

MySQL数据备份与恢复全攻略

一、数据备份与恢复按照备份方式分类:物理备份,直接复制数据库的物理文件,可以直接拷贝和恢复;逻辑备份,通过SQL语句导出数据库结构和数据,可用于不同版本和不同类型的MySQL数据库之间的数据迁移。按照数据…

单机多卡间大张量传输迷惑行为?

老铁们我最近真的好惨😭,一个大模型在单机多卡上运行就是出错,debug看的老眼昏花,最后发现大张量在设备间直接传输会有很发癫的行为,还请大家帮我看看🙇‍摒弃屎山一样的代码,简单运行下列脚本i…

无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

1 问题描述今天使用pnpm安装如下报错:pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1pnpm install~~~~ Categor…

内核编译 day61

二:内核启动 一:流程 sudo vim /etc/network/interfaces sudo chmod 0666 /etc/default/tft...... //修改可读uboot命令: help/? : 帮助手册,列出uboot支持的所有命令 printenv/print 打印环境变量 sete…

【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署

已在GitHub开源与本博客同步的YOLOv5_RK3588_object_detect项目,地址:https://github.com/A7bert777/YOLOv5_RK3588_object_detect/tree/main 详细使用教程,可参考README.md或参考本博客第六章 模型部署 文章目录一、项目回顾二、模型选择介绍…

Telematics Control Unit(TCU)的系统化梳理

1、Telematics Control Unit (TCU)概述 TCU中文名为远程信息处理控制单元,很多场合都称为Telematics Box,又叫TBox,顾名思义,一般都为一个独立的盒子(如图2、图3所示),负责和云端的远程信息交互…

Appium学习笔记

adb构成client端,在电脑上,负责发送adb命令daemon守护进程,在手机上,负责接收和执行adb命令server端,在电脑上,负责管理client和daemon之间的通信![[Pasted image 20250825201322.png]]包名,对应…

栈指针(Stack Pointer)是什么?

栈指针(Stack Pointer)是什么? 首先,用一个简单易懂的方式解释栈指针(Stack Pointer)。 核心比喻:摞起来的书 想象有一摞书整齐地堆在桌面上: 这摞书就是“栈”(Stack),它是一种后进先出(LIFO) 的数据结构。你只能从最顶部拿走一本书(“弹出”),或者把一本新…

数据结构:红黑树(Red-Black Tree)

目录 从AVL树的“烦恼”说起 如何用“颜色”来定义“大致平衡”?—— 红黑树的五个规则 五个规则如何保证“大致平衡”? 用 C/C 代码定义红黑树的结构 定义颜色和节点结构 定义树的结构和哨兵节点 从AVL树的“烦恼”说起 我们从已经了解的 AVL 树出…

Ubuntu22.04安装VMware Tools

文章目录前言安装open-mv-tools前言 本教程使用的版本是Ubuntu22.04.5,由于虚拟机上面的重新安装VMware Tools是灰的,于是自动下载安装open-mv-tools, 安装open-mv-tools 打开终端,更新一下 sudo apt update这一步可能需要先…

DBeaver连接SQL Server时添加驱动后仍提示找不到驱动的解决方法

DBeaver连接SQL Server时添加驱动后仍提示找不到驱动的解决方法 在使用DBeaver连接SQL Server时,即使您已手动添加驱动文件,系统仍提示“找不到驱动”,这通常是由驱动配置错误、版本不兼容或SQL Server设置问题引起的。以下我将逐步为您提供解…

JVM之【类加载系统】

目录 前言 类加载过程 类加载 执行过程 加载阶段 连接阶段 初始化阶段 类加载器 BootstrapClassLoader ExtClassLoader AppClassLoader 类加载器之间的关系 双亲委派机制 核心思想 好处 源码分析 类加载器之间的父子层级关系 双亲委派的体现 前言 上文中提到…

【 限流技术 | 从四大限流算法到Redisson令牌桶实践 】

引言:为什么需要限流?在现代分布式系统中,服务的稳定性是至关重要的。在遇到突发的请求量激增,恶意的用户访问,亦或是请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均…

深入解析Java NIO多路复用原理与性能优化实践指南

深入解析Java NIO多路复用原理与性能优化实践指南 技术背景与应用场景 在高并发网络编程中,传统的阻塞 I/O 模型往往因每个连接都占用一个线程或一个系统调用而导致线程资源浪费、线程切换开销剧增等问题,难以满足数万甚至数十万并发连接的负载要求。Jav…

目标检测数据集 第006期-基于yolo标注格式的汽车事故检测数据集(含免费分享)

目录 目标检测数据集 第006期-基于yolo标注格式的汽车事故检测数据集(含免费分享) 超实用汽车事故检测数据集分享,助力计算机视觉研究! 1、背景 2、数据详情 数据集基本信息 结构组成 标注格式与示例 类标签说明 数据增强情况 3、应用场景 4、…

应用密码学(书籍学习笔记、基础知识) 一

本博客为读《应用密码学》所得笔记 文章目录一、 加密与解密1.2 秘钥Key1.2.1 引入秘钥K1.2.2 加密秘钥K1,解密秘钥K2二、对称算法 VS 公开密钥算法**① 对称算法** - 传统密码算法 **(Symmetric Algorithm) 🔑****② 非对称算法特点** - 公开秘钥算法 *…

【攻防世界】Web_php_include

1.信息收集题目&#xff1a;Web_php_include &#xff1a;PHP文件包含漏洞2.思路&#xff1a;1.代码审计&#xff1a;<?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) { //在一个字符串中查…

cmake--CPack/deb

deb包的需求 怎么使用cmake把项目的依赖想打包为deb包,把项目的可执行文件和依赖文件打包为deb包,又怎么样配置apt源,让项目在jenkins构建之后,可以通过sudo apt install 下载deb包和安装到任意主机上? 整体流程概览 使用CMake构建项目:确保你的项目可以被CMake正确编译…

七十五、【Linux数据库】部署Redis服务 、 部署LNMP+Redis

Redis 与 LNMP 集成功能概述 Redis 核心功能 内存数据存储:高速读写性能 数据结构丰富:字符串、哈希、列表、集合等 持久化支持:RDB快照和AOF日志 发布订阅:消息队列功能 高可用:主从复制、哨兵模式、集群 LNMP+Redis 集成价值 会话共享:多Web服务器共享Session 数据缓存…

从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南

从YOLOv5到RKNN&#xff1a;零冲突转换YOLOv5模型至RK3588 NPU全指南 在嵌入式AI领域&#xff0c;将训练好的深度学习模型高效部署到边缘设备的NPU&#xff08;神经网络处理器&#xff09;上是提升性能的关键。本文将详细介绍如何在Ubuntu 20.04环境下&#xff0c;将YOLOv5l模型…