谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?
一、HTTPS 核心机制:非对称加密 + 对称加密
HTTPS = HTTP over TLS/SSL,通过 混合加密体系 解决三大问题:
- 防窃听 - 对称加密传输内容(如 AES)
- 防篡改 - 数字签名验证数据完整性
- 防冒充 - 数字证书验证服务器身份
// 前端感知的典型场景:混合内容拦截
// 在 HTTPS 页面加载 HTTP 资源会被浏览器拦截
<img src="http://example.com/image.jpg">
// 控制台报错:Mixed Content: The page was loaded over HTTPS...
二、TLS 握手流程详解(三次握手后)
1. Client Hello
客户端发送:
- 支持的 TLS 版本(如 TLS 1.3)
- 客户端随机数(Client Random)
- 加密套件列表(如 ECDHE-RSA-AES128-GCM-SHA256)
# 开发者工具查看加密套件(Chrome)
chrome://flags/#tls13-variant
2. Server Hello
服务端回应:
- 选定的 TLS 版本和加密套件
- 服务器随机数(Server Random)
- 数字证书(包含公钥)
// 前端可通过 JS 获取证书信息(需要用户授权)
navigator.mediaDevices.getUserMedia({ video: true }).then(() => {const cert = document.querySelector('video').getCertificate();console.log(cert.issuer); // 颁发机构});
3. 证书验证
客户端验证证书:
- 证书链是否可信(CA 机构签发)
- 域名是否匹配
- 是否过期
// 开发环境常见错误:自签名证书报错
// 解决方案1:浏览器手动信任(危险)
// 解决方案2:配置本地CA(推荐使用 mkcert)
// 生成本地证书
$ mkcert -install
$ mkcert localhost 127.0.0.1 ::1
4. 密钥交换(以 ECDHE 为例)
- 服务端发送 Server Params(椭圆曲线公钥)
- 客户端生成 Client Params 并发送
- 双方通过 ECDHE 算法生成 Pre-Master Secret
# 简化版密钥计算逻辑(实际为二进制操作)
client_random = 0x1234
server_random = 0x5678
pre_master = ecdhe(client_params, server_params)
master_secret = PRF(pre_master, client_random + server_random)
5. 切换加密协议
双方用 Master Secret 生成对称密钥,后续通信使用对称加密。
三、前端开发重点场景
场景1:强制全站 HTTPS
nginx
# Nginx 配置自动跳转(301 永久重定向)
server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}
html
<!-- 前端兜底方案(慎用) -->
<script>
if (location.protocol !== 'https:') {location.replace(`https://${location.host}${location.pathname}`);
}
</script>
场景2:安全 Cookie 传输
javascript
// 设置 Secure + HttpOnly + SameSite
document.cookie = `session=xxx; Secure; HttpOnly; SameSite=Lax`;
场景3:HSTS 预加载
nginx
# 添加 Strict-Transport-Security 头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
提交预加载列表
四、性能优化实践
技巧1:Session Resumption
复用 TLS 会话减少握手耗时:
nginx
# Nginx 配置会话票证
ssl_session_tickets on;
ssl_session_timeout 1d;
技巧2:OCSP Stapling
由服务端缓存证书状态,减少客户端验证耗时:
nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
技巧3:TLS 1.3 升级
比 TLS 1.2 减少一次 RTT:
nginx
ssl_protocols TLSv1.3 TLSv1.2;
五、常见坑点排查指南
问题1:证书链不完整
现象:Android 低版本报错,iOS 正常
解决:使用 openssl 补全证书链
bash
$ openssl s_client -showcerts -connect example.com:443
$ cat fullchain.pem > chained.crt # 合并根证书和中间证书
问题2:混合内容阻塞
定位:使用 CSP 报告收集非 HTTPS 请求
html
<meta http-equiv="Content-Security-Policy" content="default-src https: 'unsafe-inline' 'unsafe-eval'; report-uri /csp-report">
问题3:CDN 证书配置错误
检测工具:
bash
$ curl -I https://example.com # 检查 Server 头
$ nscurl --ats-diagnostics https://example.com # iOS 特性检测
六、开发环境 HTTPS 最佳实践
方案1:Webpack DevServer 配置
javascript
// webpack.config.js
const fs = require('fs');
const https = require('https');
module.exports = {devServer: {https: {key: fs.readFileSync('localhost-key.pem'),cert: fs.readFileSync('localhost.pem')},public: 'https://localhost:8080' // 避免浏览器警告}
};
方案2:Service Worker 调试
javascript
// sw.js 中捕获证书错误
self.addEventListener('fetch', event => {if (event.request.url.startsWith('https://')) {event.respondWith(fetch(event.request).catch(err => {console.error('证书错误:', err);return new Response('HTTPS故障');}));}
});
七、终极检测清单
- 所有子域名启用 HTTPS(包括 CDN)
- 配置 HSTS 头部并提交预加载
- 定期更新 TLS 证书(监控到期时间)
- 禁用不安全协议(SSLv3、TLS 1.0)
- 使用 Qualys SSL Labs 评分达到 A+
bash
# 一键检测(需安装 testssl.sh)
$ testssl.sh --color 0 example.com
通过理解 TLS 握手流程,前端开发者能更好地处理证书错误、优化资源加载策略,并推动全站安全升级。记住:HTTPS 不是终点,而是现代 Web 应用的起跑线。
相关文章:
谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?
一、HTTPS 核心机制:非对称加密 对称加密 HTTPS HTTP over TLS/SSL,通过 混合加密体系 解决三大问题: 防窃听 - 对称加密传输内容(如 AES)防篡改 - 数字签名验证数据完整性防冒充 - 数字证书验证服…...
使用DeepSeek+KIMI生成高质量PPT
一、使用DeepSeek DeepSeek官网:DeepSeek 点击“开始对话”,进入交互页面。 在上图中,输入问题,即可获取AI生成的结果。 基础模型(V3):通用模型(2024.12),高…...
基于SpringBoot的失物招领平台的设计与实现
基于SpringBoot的失物招领平台的设计与实现 基于微信小程序的失物招领系统 失物招领小程序 校园失物招领小程序 基于微信小程序SSMMySQL开发,高分JAVA成品毕业设计,附带往届论文、启动教程、讲解视频、二次开发教程和配套安装包文件,论文中…...
鸿蒙NEXT开发-元服务和服务卡片的开发
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 1. 元服务基本概念 1.1 基本介绍 1.2 元…...
【Spark+Hive】基于Spark大数据技术小红书舆情分析可视化预测系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
目录 一、项目背景 二、项目目标 三、算法介绍 四、开发技术介绍 五、项目创新点 六、项目展示 七、权威教学视频 源码获取方式在文章末尾 一、项目背景 在数字经济蓬勃发展的当下,社交电商平台小红书凭借其"内容电商"的独特模式,已…...
IO基础知识和练习
一、思维导图 二、练习 1.使用标准IO函数,实现文件的拷贝 #include <head.h> int main(int argc, const char *argv[]) {FILE *pfopen("./one.txt","r");FILE *fpfopen("./two.txt","r");if(pNULL)PRINT_ERROR(&qu…...
gradle libs.versions.toml文件
1.libs.versions.toml介绍2.创建libs.versions.toml文件3.libraries5.versions6.plugins7.bundles 1.libs.versions.toml介绍 下图是官网介绍 意思就是说项目所有插件和库的依赖版本都统一在这个文件配置。 文件中有以下四个部分 versions, 申明要使用的插件和库的版本号的…...
影刀RPA开发拓展--SQL常用语句全攻略
前言 SQL(结构化查询语言)是数据库管理和操作的核心工具,无论是初学者还是经验丰富的数据库管理员,掌握常用的 SQL 语句对于高效管理和查询数据都至关重要。本文将系统性地介绍最常用的 SQL 语句,并为每个语句提供详细…...
2024_BUAA数据结构上机题解分享
📎 GitHub/Gitee同步开源 | 🚀 点击访问Gitee仓库 点击访问GitHub仓库 (若访问缓慢可尝试切换仓库镜像源) 这份代码库不是捷径,而是北航数据结构的生存地图。当你被困在递归迷雾中时,愿这些经过OJ系统千锤百…...
什么是分布式和微服务?
一、分布式系统 定义: 分布式系统是由多个独立的计算节点(或称为服务器、计算机)通过网络相互连接,共同协作以完成特定任务的系统。这些节点可以运行在不同的物理服务器或虚拟机上。 核心思想: 提高系统的可扩展性&am…...
2025 Lakehouse 趋势全景展望:从技术演进到商业重构
1. 为什么湖仓正在成为企业数据架构的必选项? 越来越多的企业正在通过实时数据处理能力构建核心竞争力——用户期待 APP 精准捕捉需求并实时响应,企业员工追求业务系统的秒级反馈,这些场景背后是千亿级数据资产的敏捷调度。 据 IDC 预测&am…...
一、NRF2401无线通信模块使用记录
一、电路引脚图 1、引脚说明: 2、引脚标号: 找到1号引脚,与原理图对号入座。 3、cubemx初始化配置: 5、驱动文件 配置spi,并构建发送与接收函数接口 .h #define TX_ADR_WIDTH 5 //发射地址宽度 #define TX_PLO…...
NVIDIA GPU 架构详解:Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell
目录 1. Pascal(帕斯卡)架构(2016)关键技术性能特性代表产品应用场景 2. Volta(伏特)架构(2017)关键技术性能特性代表产品应用场景 3.Turing(图灵)架构&#…...
初阶数据结构(C语言实现)——3顺序表和链表(2)
2.3 数组相关面试题 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接 力扣OJ链接-移除元素删除排序数组中的重复项。力扣OJ链接-删除有序数组中的重复项合并两个有序数组。力扣OJ链接-合并两个有序数组 2.3.1 移除元素 1…...
DeepSeek R1模型性能瓶颈分析与解决方案
摘要 研究发现,DeepSeek R1模型在处理复杂问题时可能遭遇性能瓶颈。当模型过度思考时,其性能会下降。通过减少不必要的思考过程,计算成本可降低43%。研究团队分析了4018条轨迹数据,并创建了一个开源数据集,以推动智能体…...
IP-----BGP协议
7.BGP协议 1.BGP的所属分类 2.BGP的特性 3.BGP的数据包 4.BGP的6种状态机 5.BGP的工作过程 6.BGP的路由黑洞 1.BGP路由黑洞 2.解决方法 7.BGP的防环 1.EBGP水平分割 2.IBGP水平分割 1.解决IBGP环路的规则 2.解决IBGP水平分割问题 3.作用 8.BGP的基础配置 1.查看…...
【String】917. 仅仅反转字母
917. 仅仅反转字母 - 力扣(LeetCode) 使用双指针,一个指针指向s的开始,一个指向s的末尾,同时遍历即可。...
python3使用selenium打开火狐并全屏
序言 本来桌面端全屏这种东西现在用electron或者tauri来做软件的全屏,但是奈何今天拿到了一块早些年的nx板子,arm架构的,系统有点老,装node只能到16版本,装了半天终于搞好了,发现这个系统没法隐藏系统的顶…...
探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…...
Spring Bean 作用域设置为prototype在并发场景下是否是线程安全的
在并发场景下,将 Spring Bean 作用域设置为 prototype 通常能在一定程度上保证线程安全,但这并不意味着绝对的线程安全 1. prototype 作用域的特点 在 Spring 中,Bean 的作用域定义了 Bean 的生命周期和可见性。prototype 作用域表示每次从…...
金融项目实战
测试流程 测试流程 功能测试流程 功能测试流程 需求评审制定测试计划编写测试用例和评审用例执行缺陷管理测试报告 接口测试流程 接口测试流程 需求评审制定测试计划分析api文档编写测试用例搭建测试环境编写脚本执行脚本缺陷管理测试报告 测试步骤 测试步骤 需求评审 需求评…...
mybatis热点面试题第五弹
1. MyBatis与Hibernate的区别 答案: MyBatis: 不完全是一个ORM框架,需要手动编写SQL语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库,…...
c++头文件和命名空间
在 C 中,头文件和命名空间是两个重要的概念,它们分别用于代码组织和作用域管理。 一、头文件(Header Files) 1. 作用 声明接口:存放函数、类、变量的声明(而非定义)。代码复用:通…...
命令行参数和环境变量 ─── linux第13课
目录 命令行参数 命令行参数列表: 如何实现命令行参数传递到此进程 环境变量 基本概念 常见环境变量 查看环境变量方法 编辑 环境变量如何写入 总结: 测试PATH 命令行参数 同一个程序,可以根据命令行参数的不同,表现不同功能 比如:指令中的选项的实现. ls -al…...
基于 openEuler 22.09 的 OpenStack Yoga 部署
openEuler 虚拟化环境部署 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 作用 Controller 192.168.184.110 控制节点 Compute 192.168.184.111 计算节点 Storage 192.168.184.112 存储节 一 基础配置 1.1 配置 yum 源 由于 op…...
【Linux实践系列】:用c语言实现一个shell外壳程序
🔥本文专栏:Linux Linux实践项目 🌸博主主页:努力努力再努力wz 那么今天我们就要进入Linux的实践环节,那么我们之前学习了进程控制相关的几个知识点,比如进程的终止以及进程的等待和进程的替换,…...
通俗易懂的分类算法之K近邻详解
通俗易懂的分类算法之K近邻详解 用最通俗的语言和例子,来彻底理解 K近邻(K-Nearest Neighbors,简称 KNN) 这个分类算法。不用担心复杂的数学公式,我会用生活中的例子来解释,保证你一听就懂! 1.…...
NO.19十六届蓝桥杯模拟赛第三期上
1 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问, 2024 的最大的质因数是多少? 答:23 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false)…...
基于 Rust 与 GBT32960 规范的编解码层
根据架构设计,实现编解码层的代码设计 Cargo.toml 加入二进制序列化支持 # 序列化支持 ... bincode "1.3" # 添加二进制序列化支持 bytes-utils "0.1" # 添加字节处理工具 开始编码 错误处理(error.rs&#x…...
conda安装及超详细避坑实战
1. Anaconda介绍。 Anaconda是一站式数据科学与机器学习平台,专为开发者、数据分析师设计,并带有python中超过180个科学包及其依赖项。通过 Anaconda,您可以轻松管理数据环境、安装依赖包,快速启动数据分析、机器学习项目。 Anaconda集成了…...
