谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?

一、HTTPS 核心机制:非对称加密 + 对称加密

HTTPS = HTTP over TLS/SSL,通过 ​混合加密体系​ 解决三大问题:

  1. 防窃听​ - 对称加密传输内容(如 AES)
  2. 防篡改​ - 数字签名验证数据完整性
  3. 防冒充​ - 数字证书验证服务器身份
// 前端感知的典型场景:混合内容拦截
// 在 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故障');}));}
});

七、终极检测清单
  1. 所有子域名启用 HTTPS(包括 CDN)
  2. 配置 HSTS 头部并提交预加载
  3. 定期更新 TLS 证书(监控到期时间)
  4. 禁用不安全协议(SSLv3、TLS 1.0)
  5. 使用 Qualys SSL Labs 评分达到 A+
 

bash

# 一键检测(需安装 testssl.sh)
$ testssl.sh --color 0 example.com

通过理解 TLS 握手流程,前端开发者能更好地处理证书错误、优化资源加载策略,并推动全站安全升级。记住:HTTPS 不是终点,而是现代 Web 应用的起跑线。

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

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

相关文章

共轭梯度法笔记

一、梯度下降法 x k 1 x k − α ∇ f ( x k ) x_{k1} x_k - \alpha \nabla f(x_k) xk1​xk​−α∇f(xk​) 这是普通的梯度下降公式&#xff0c;有两个量是关键&#xff0c;步长 α \alpha α和方向 ∇ f ( x k ) \nabla f(x_k) ∇f(xk​)。这里的方向直接选择了梯度方向&…

ubuntu 启动不起来,光标闪烁 解决方法

ubuntu 启动不起来&#xff0c;光标闪烁 进不了系统&#xff0c;解决方法 按ctrl alt f2&#xff0c;进入终端&#xff0c;登录。 jounal -b 查看启动日志。 发现是找不到显卡驱动程序。 解决方法&#xff1a; 卸载nvidia程序。 sudo systemctl stop gdm # 适用于GNOME…

CSS - 妙用Sass

官方文档&#xff1a;https://www.sass.hk/docs/ 1.例1&#xff1a; each $theme in $themeList {$themeKey: map-get($theme, key);media screen and (weex-theme: $themeKey) {.btnText {max-width: 150px;include font(map-get($theme, medFont),map-get($theme, subFontS…

chromadb向量数据库使用 (2)

目录 代码代码解释**1. 导入 chatGLM 嵌入函数****2. 创建 ChromaDB 客户端和集合****3. 查询集合中的数据数量****4. 添加数据到集合****5. 获取已存储的文档****6. 更新文档****7. 再次获取数据&#xff0c;验证更新结果****8. 删除某个文档****9. 获取已删除的文档****总结*…

我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品

基础的物品大家都会做了对吧?包括武器的释放技能,这次来点难度,让物品的贴图呈现动画效果和扔出后显示3D立体效果,这个3D立体效果需要先学习blockbench,学习如何制作贴图。 Blockbench Blockbench是一个用于创建和编辑三维模型的免费软件,特别适用于Minecraft模型的设计…

大模型在败血症预测及围手术期管理中的应用研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、败血症概述 2.1 定义与流行病学 2.2 病因与发病机制 2.3 临床表现与诊断标准 2.4 并发症与危害 三、大模型技术原理及在医疗领域的应用 3.1 大模型技术概述 3.2 大模型在医疗领…

SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析

引言&#xff1a;接口测试的必要性 在微服务架构盛行的今天&#xff0c;SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测&#xff0c;使用OpenAPI规范打通测试全流程&#xff0c;让您的接口质量保障体系更加完备。…

微软具身智能感知交互多面手!Magma:基于基础模型的多模态AI智能体

作者&#xff1a; Jianwei Yang, Reuben Tan, Qianhui Wu, Ruijie Zheng, Baolin Peng, Yongyuan Liang, Yu Gu, MuCai, SeonghyeonYe, JoelJang, Yuquan Deng, Lars Liden, Jianfeng Gao 单位&#xff1a;微软研究院&#xff0c;马里兰大学&#xff0c;威斯康星大学麦迪逊分校…

Linux中jdk-8u291-linux-x64 中jdk工具包

jdk-8u291-linux-x64 指的是适用于 64 位 Linux 系统的 Java 开发工具包&#xff08;JDK&#xff09;8 更新 291 版本。这是 JDK 的一个特定版本&#xff0c;用于开发 Java 应用程序和小程序。 jdk-8u291-linux-x64 网盘下载链接&#xff1a;夸克网盘分享

Baklib云内容中台的核心架构是什么?

云内容中台分层架构解析 现代企业内容管理系统的核心在于构建动态聚合与智能分发的云端中枢。以Baklib为代表的云内容中台采用三层架构设计&#xff0c;其基础层为数据汇聚工具集&#xff0c;通过标准化接口实现多源异构数据的实时采集与清洗&#xff0c;支持从CRM、ERP等业务…

17.3 LangSmith Evaluation 深度解析:构建数据驱动的模型优化体系

LangSmith Evaluation 深度解析:构建数据驱动的模型优化体系 关键词:模型评估体系、自动化测试框架、业务指标对齐、A/B测试集成、生产级质量监控 1. Evaluation 核心功能全景 1.1 评估维度矩阵 维度评估指标示例采集方式质量评估准确率、相关性评分、事实性检查人工标注+A…

华为 VRP 系统简介配置SSH,TELNET远程登录

华为 VRP 系统简介&配置TELNET远程登录 1.华为 VRP 系统概述 1.1 什么是 VRP VRP&#xff08;Versatile Routing Platform 华为数通设备操作系统&#xff09;是华为公司数据通信产品的通用操作系统平台&#xff0c;从低端到核心的全系列路由器、以太网交换机、业务网关等…

算法基础 -- 字符串哈希的基本概念和数学原理分析

字符串哈希的基本概念和数学原理分析 1. 字符串哈希的定义和基本概念 哈希函数的定义 哈希函数&#xff08;Hash Function&#xff09;是一种将任意长度的输入映射为固定长度输出的函数。对于字符串而言&#xff0c;哈希函数通过某种算法将字符串转换成一个整数&#xff0c;…

从新加坡《Companion Guide on Securing AI Systems 》看可信AI全生命周期防护框架构建

从新加坡《AI系统安全指南配套手册》看可信AI全生命周期防护框架构建 一、引言 1.1 研究背景与意义 近年来,人工智能(AI)技术以前所未有的速度蓬勃发展,已然成为推动各行业变革与创新的核心驱动力。从医疗领域辅助疾病诊断,到金融行业的风险预测与智能投顾,再到交通领…

C++学习之C++初识、C++对C语言增强、对C语言扩展

一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 &#xff0c;理解为打开一个房间&#xff0c;房间里有我们所需…

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&l…

eMMC存储器详解(存储区域结构、EXT_CSD[179]、各分区介绍、主要引脚、命令格式与类型等)

读本篇博文所需要的先行知识 关于芯片内部的ROM的作用、工作原理的介绍&#xff0c;链接如下&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/145969584 eMMC的物理结构、特点、用途 这个标题的相关内容见我的另一篇博文&#xff0c;博文链接如下&#xff1a…

分布式锁—2.Redisson的可重入锁一

大纲 1.Redisson可重入锁RedissonLock概述 2.可重入锁源码之创建RedissonClient实例 3.可重入锁源码之lua脚本加锁逻辑 4.可重入锁源码之WatchDog维持加锁逻辑 5.可重入锁源码之可重入加锁逻辑 6.可重入锁源码之锁的互斥阻塞逻辑 7.可重入锁源码之释放锁逻辑 8.可重入锁…

iOS实现一个强大的本地状态记录容器

我们开发中经常会遇到这样的场景&#xff0c;就是我们客户端用户进行了某个操作&#xff0c;这个操作影响了数据的状态&#xff0c;但是我们又不方便重新请求一次数据&#xff0c; 这个时候&#xff0c;就需要我们记录一下本地状态在内存中&#xff0c;随着业务越来越复杂&…

vue中带$的是什么

在Vue.js中&#xff0c;带的 $ 符号用于表示 Vue实例的属性和方法。 这些属性和方法是Vue框架内部定义的&#xff0c;主要用于方便开发者在组件内部访问和使用。 常见的带$的属性和方法: ‌$data‌&#xff1a;用于访问组件的内部数据对象&#xff0c;包含组件内定义的所有响…