Web 性能优化:TLS

news2025/1/10 3:27:08

个人博客

  • Web 性能优化:TCP
  • 🎯 Web 性能优化:TLS
  • Web 性能优化:HTTP

“do it, do it work, do it better … and secure ☠️”

随着追逐利益而来的恶意参与者越来越多,当前的 Web 应用,已经从野蛮生长转而越来越多地关注安全 —— 通信安全、数据安全、用户安全、企业安全,甚至国家安全。作为通过网络传输数据的应用,最简单的获取安全的方式是采用 TLS。

TLS(Transport Layer Security),即传输层安全,TLS 直接构建在传输层之上,一般基于 TCP,也可以基于 UDP(如 DTLS)。TLS 负责将待传输的数据加密,加密后传输过程中任何中间方都再看不到具体内容,保障了安全性。关于 TLS 的更多内容可参见另一篇博文 简单解释TLS,本篇不再赘述。

我们的关注点重新集中到性能上,任何的引入必然导致额外的开销,对于 Web 应用来说,最要命的开销就是延迟。那么可以从哪些方面着手优化延迟?

会话复用

在上一篇关于 TCP 的讨论中,我们知道每次 tcp 连接的建立都需要经过三次握手,产生至少一个 RTT(Round-Trip Time) 的延迟,现在引入 tls,情况又如何?
在这里插入图片描述

对于建立在 tcp 之上的 tls,除了因为 tcp 三次握手引入的一个 RTT 延迟外,根据 tls 协议设计,TLS 会话的一次完整握手还会再引入 2 个 RTT 的延迟,所以一个 https 连接的初次建立过程会引入 3 个 RTT 延迟。

tcp 通过连接复用实现在需要的时候规避握手延迟,类似地,tls 也有会话复用机制——称为简短握手,可将 2 次 RTT 延迟减少到 1 次。

这是如何做到的呢?在建立会话时,服务器会创建一个 32 byte 的会话 id —— 会话 id 可以关联到该次会话协商出的一系列加密参数,然后通过 ServerHello 消息发送给客户端。在下一次通信时,客户端可以在发送的 ClientHello 消息中包含上一次的会话 id,如果服务器认可,则接下来就可以基于上一次会话的会话参数开始通信,从而省去 1 次 RTT。

在这里插入图片描述

在需要同时发起多个 https 连接时,可以重用第一个 tls 握手协商出来的会话参数。

一般服务器端可以将 tls 会话的有效时间设置为 1 天,对于高并发场景,可能导致会话缓存占用过多的内存资源,必须要设计好相应的缓存淘汰机制,或者采用会话记录单机制 —— 服务端使用密钥将会话相关的参数加密后发给客户端,由客户端保存,后续需要时客户端将加密信息发回服务端,服务端解密后使用。

TLS 记录

TLS 会将消息拆分为若干条 TLS 记录,每条记录上限为 16 KB。TLS 记录太小的话,在 tcp 分组中占比太小,浪费 tcp 分组;TLS 记录太大的话,会分拆为若干 tcp 分组,此时需要等待所有分组到达,才能解密出数据,引入额外延迟。

From optimizing-tls-record-size-and-buffering-latency

所以最好将 TLS 记录大小配置为恰好放入一个 tcp 分组,也可以配置为根据相关窗口大小动态调整记录大小。

证书验证

TLS 的安全是建立在 PKI 体系之上,在 PKI 体系中,由权威证书颁发机构给网站颁发身份证书,在 tls 握手过程中,服务器需要发送证书给客户端以验明正身。但证书这玩意,有生就有死,所以客户端在收到证书后,除了查看证书里签发时写入的静态信息是否确实可信,还要验证证书在当前时刻是否还有效。

这是一个典型的响应优先还是一致性优先的问题,方案不外乎两种:缓存 or 实时。

  • 缓存方案:证书颁发机构会维护一个已撤销证书列表,称为 CRL(Certificate Revocation List,证书撤销名单),服务器或者客户端可以缓存到本地使用。缓存的问题就是,有可能你刚刚缓存过一次,就有一个证书被撤销了,导致缓存与实际状态不一致。
  • 实时方案:鉴于缓存方案的问题,提供了互补的实时查询方案,称为 OCSP(在线证书状态协议),OCSP 的问题在于可能会阻塞 tls 协商过程,需要等待 OCSP 验证完成才能继续,特别是内网环境使用 IE + 自签名证书开发时容易被坑,博主就被坑过一次。如果访问不了证书颁发机构,且环境允许,可以考虑禁用 OCSP。

出于安全考虑,一般网站的证书不会直接使用根证书签发,而是使用(根证书签发出来的)中间证书签发,而根证书密钥则被离线存放。由于浏览器验证证书时,会顺着证书链验证每个节点的证书,所以这里有几个可以优化的点:

  • 服务端在发送时最好同时把中间证书也一并附上,避免浏览器再单独发起一次中间证书请求,引入额外的延迟;
  • 发送时无需包含根证书,因为已经存在客户端了;
  • 签发证书层次不要过多,最好就一层中间证书,否则发送证书链时,数据太多;
  • 非必要的证书就不要发了,避免传输数据过多,导致额外的分片,引入额外延迟;
  • OCSP stapling,由服务端来发起 OCSP 请求,并将请求响应放在给客户端的证书链中,需要浏览器支持。
  • 使用椭圆曲线证书链,比 RSA 证书链小,传输数据少一点;
  • 同一张证书不要绑定过多域名,传输数据少一点。

其他

ALPN(Application Layer Protocol Negotiation)

在 tls 握手过程中嵌入 ALPN 机制,协商上层使用的应用协议,不用等待 tls 建立后单独协商,减少延迟,整个过程就是在 ClientHello 中增加一个 ProtocolNameList 字段,服务器收到后在 ServerHello 回复中返回选中的协议。


参考

《Web 性能权威指南》

《HTTPS 权威指南》

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

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

相关文章

【通关MySQL】Java的JDBC编程

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【通关MySQL】 ✈️✈️本篇内容:Java的JDBC编程。 🚀🚀代码存放仓库gitee:MySQL码云存放! ⛵⛵作者简介&#xff…

[附源码]java毕业设计-室内田径馆预约管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

轻量应用服务器和云服务器CVM有什么区别?

腾讯云新推出的轻量应用服务器Lighthouse和原来的CVM云服务器有什么区别?轻量应用服务器Lighthouse是一种易于使用和管理、适合承载轻量级业务负载的云服务器,主要用于Web网站应用,轻量服务器使用及后期运维更加简单方便;云服务器…

RNA-seq 保姆教程:差异表达分析(二)

介绍 RNA-seq 目前是测量细胞反应的最突出的方法之一。RNA-seq 不仅能够分析样本之间基因表达的差异,还可以发现新的亚型并分析 SNP 变异。本教程[1]将涵盖处理和分析差异基因表达数据的基本工作流程,旨在提供设置环境和运行比对工具的通用方法。由于完整…

计算机网络——数据链路层

数据链路层概述 数据链路层在网络体系结构中所处的地位 主机H1给主机H2发送数据时,需要通过路由器R1通过广域网链路转发到路由器R2,R2转发到主机H2。路由器转发只用到网络层及以下各层。【以上涉及数据包按网络体系结果逐层封装解封】 为了简单起见&am…

DevC++的调试方法

目录 Dev C调试程序 Dev C调试注意事项对于修改后的程序,调试程序之前一定要先编译程序。 要想学会编程,第一步就是要学会调试(想我这种码龄一年的人还不会调试,丢死人). 今天,为了让你们的脸丢少点,特意写了这篇博文,给予需要帮助的人. 所谓调试程序&#xff0…

[附源码]计算机毕业设计JAVA基于JSP健身房管理系统

[附源码]计算机毕业设计JAVA基于JSP健身房管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM m…

Python实现KNN(K近邻)分类模型(KNeighborsClassifier算法)并应用网格搜索算法寻找最优参数值以及数据标准化均衡化项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 股票市场是已经发行的股票转让、买卖和流通的场所,包括交易所市场和场外交易市场两大类别。…

【C++】C++11部分特性

目录 一、初始化列表 二、变量类型的推导 1、auto 2、decltype 三、右值引用 1、左值与右值 2、关于左值引用、右值引用的问题 1、左值引用可以引用右值吗? 2、右值引用可以引用左值吗? 3、右值引用之后的问题 3、移动构造、移动拷贝 1、引用…

软件测试质量保证与测试

软件测试质量保证与测试 第一章 软件测试概述 1.1 软件测试背景 随着计算机技术的迅速发展和越来越广泛深入地应用于国民经济与社会生活的各个方面,软件系统的规模和复杂性与日俱增,软件的生产成本和软件中存在的缺陷与故障造成的各类损失也大大增加&…

【应用】PostgreSQL 流复制配置

PostgreSQL 流复制配置centos7 安装 postgresql时序库 timescaleDB 的安装postgresql-14 主从流复制主库配置从库配置同步流复制与异步流复制异步流复制转换为同步流复制流复制的相关参数主从流复制原理PostgreSQL WAL 日志主从流复制架构主从流复制的过程基于 docker swarm 的…

CMSC5713-IT项目管理之七、质量管理Quality Management

文章目录7.1 Quality7.2. Software Quality7.2.1. ISO/IEC 25010 Software Qualities7.2.2. Internal versus External qualities7.2.3. Software Metrics7.3. Quality Specification7.4. Project Quality Management7.4.1. Quality Planning7.4.2. Quality Assurance7.4.2.1. …

vscode 阅读 linux kernel 源码

前言 虽然身边的朋友大都在使用 source insight,但我却更喜欢 vscode。 不过 vscode 在代码搜索上确实不如 source insight,这点上我也是吃过亏的。阅读大型代码时,常常搜索不到关键代码,导致对代码的理解不充分。 当使用 vscode…

Java-反射

前言 动态语言与静态语言 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构主要动态语言有:Object…

【开源电路】STM32F401RCT6开发板

【开源电路】STM32F401RCT6开发板🌷实物PCBA: 🌼优化后的3D效果图 📚STM32F401RCT6开发板简介 📑主控是LQFP-64封装的STM32F401RCT6芯片,Micro USB接口供电,功能引脚全部引出,一个…

金融强化学习与finRL开发包

原创文章第110篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。 01 一些感受 时代的一粒沙,落在每个人身上就是一座山。 这三年,对于这句话,相信很多人更能感同身受。 看历史风云变幻,轻轻…

力扣(LeetCode)21. 合并两个有序链表(C++)

迭代 同时遍历两个链表 , 当前结点值较小的结点插入新的链表尾部。直到有一个链表为空 , 我们将另一个非空链表插入新的链表尾部。 提示 : 使用哑结点,避免特判头结点。二路归并思想应用于链表~ class Solution { public:ListNode* mergeT…

gRPC gateway - Http Restful API gRPC 协议转换

gRPC gateway - http restful gRPC gateway 介绍 gRPC-Gateway 是protocalBufffer的编译插件,根据protobuf的服务定义自动生成反向代理服务器,并将Restful Http API 转化为 gRPC通信协议。反向代理服务器根据 google.api.http 注解生成。 gRPC底层是使用HTTP2 协…

mybatis # $

总结: # 你传入的变量类型会被保留 $ 本质就是拼接 不会考虑拼串的 $ 情况下 参数是整数 跟参数是字符串 字符串情况: 缺少’’ 相当于字符串拼接 ”select * from t_user where username “ “张三” ”select * from t_user where username 张三&…

java 容器

java 容器 数组 数组的扩容问题 ArrayList 的默认初始化容量为0,首次添加元素时,创建容量为(10 || 添加集合大小) ,以后每次扩容的话,为当前容量的1.5倍 public ArrayList() {/*初始化容量大小为0private static final Object…