网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术
简介:为了保障数据的安全性,客户端会先和服务器进行 TLS 握手,有什么办法可以减少 TLS 握手的带宽消耗呢?
编者按:BabaSSL 是一款开源的密码库产品,在 GitHub 和龙蜥社区开源,并加入到龙蜥社区(OpenAnolis)的商密软件栈 SIG 组,且作为 Anolis 商密 OS 的核心组件之一。本文作者张成龙(刻一),是蚂蚁集团技术专家,负责BabaSSL密码库产品,也是OpenSSL贡献者之一。
前言
随着 5G 网络的建设,加速了移动互联网应用的发展,包括短视频、在线教育、物联网等领域。但是在现实生活中,依然存在网络信号不好的场景,包括地下商场、车库、地铁等地方,或者是由于网络拥塞导致的弱网环境下,应用在使用过程中加载缓慢,导致用户体验变差。这时候就需要对弱网环境进行优化,而手段之一就是想办法降低网络数据传输。
为了保障数据的安全性,通常使用 TLS/SSL 进行加密传输。当客户端访问服务器后台时,客户端会先和服务器进行 TLS 握手。在 TLS 完整握手时,服务端会发送证书链用于身份认证,而握手时数据传输的大部分都来自于证书。
有什么办法可以减少 TLS 握手的带宽消耗呢?如果证书可以被压缩,甚至“消失”,那就可以大大降低数据传输。RFC 8879 TLS Certificate Compression 就是为了解决这个问题,在 TLS 1.3 握手时提供证书压缩功能。
BabaSSL 是一款开源的密码库产品,在 GitHub 和 OpenAnolis 龙蜥社区开源,并加入到龙蜥社区(OpenAnolis)的商密软件栈 SIG 组,且作为 Anolis 商密 OS 的核心组件之一,替代 OpenSSL 成为系统默认的基础密码算法库;基于 OpenSSL 1.1 版本并保持兼容性,在 OpenSSL 的基础上实现了一系列自主可控的安全特性,包括各种国密算法、国密标准的实现以及大量提高密钥安全强度的特性实现。目前,BabaSSL 已经支持 TLS 证书压缩功能,而 OpenSSL 还不支持。
TLS 证书压缩介绍

1、如果客户端支持证书压缩,在 ClientHello 消息中携带 compress_certificate 扩展,该扩展中包含支持的压缩算法列表;
2、服务端收到 ClientHello,发现对方支持证书压缩,如果服务端也支持证书压缩,同时支持客户端声明的压缩方法,则使用该算法压缩 Certificate 消息;
3、服务端发送 CompressedCertificate 消息,代替原来的 Certificate 消息,CompressedCertificate 消息中包含压缩算法,解压后的长度和压缩的 Certificate 消息;
4、 客户端收到 CompressedCertificate 消息后,使用其中的 algorithm 解压,如果解压成功,则进行后续处理,否则关闭连接并发送 bad_certificate 警告。服务端发送 CertificateRequest 消息,然后客户端发送 CompressedCertificate 消息的处理流程和上述类似,不再赘述。
标准中定义的压缩算法:
除了 RFC 中定义的这 3 种算法,用户还可以使用其他算法,值 16384 到 65535 用于留给用户自已使用。
实战TLS证书压缩
开源 BabaSSL 密码库已经支持 TLS 证书压缩功能,需要在构建 BabaSSL 时开启该功能,config 后添加 enable-cert-compression。
可以在设置 SSL_CTX 时,添加证书压缩算法,代码示例如下:
#include <openssl/ssl.h>
#include <zlib.h> static int zlib_compress(SSL *s,
const unsigned char *in, size_t inlen,
unsigned char *out, size_t *outlen)
{ if (out == NULL) {
*outlen = compressBound(inlen);
return 1;
} if (compress2(out, outlen, in, inlen, Z_DEFAULT_COMPRESSION) != Z_OK)
return 0; return 1;
} static int zlib_decompress(SSL *s,
const unsigned char *in, size_t inlen,
unsigned char *out, size_t outlen)
{
size_t len = outlen; if (uncompress(out, &len, in, inlen) != Z_OK)
return 0; if (len != outlen)
return 0; return 1;
} int main() {
const SSL_METHOD *meth = TLS_client_method();
SSL_CTX *ctx = SSL_CTX_new(meth); /* 配置证书、私钥... */ /* 例如:设置压缩算法为zlib */
SSL_CTX_add_cert_compression_alg(ctx, TLSEXT_cert_compression_zlib,
zlib_compress, zlib_decompress); SSL *con = SSL_new(ctx); /* 握手... */ return 0;
}
也可以使用 BabaSSL 提供的 s_client 和 s_server 来使用 TLS 证书压缩功能:
# 服务端
/opt/babassl/bin/openssl s_server -accept 127.0.0.1:34567 -cert server.crt -key server.key -tls1_3 -cert_comp zlib -www -quiet # 客户端
/opt/babassl/bin/openssl s_client -connect 127.0.0.1:34567 -tls1_3 -cert_comp zlib -ign_eof -trace
测试压缩算法和压缩率
服务端配置证书链,CA 证书 + 中间 CA + 域名证书,TLS 1.3 握手且开启证书压缩,对比各个压缩算法的压缩率如下:
有些压缩算法是支持设置字典的,比如 brotli、zstd。可以提前计算好字典内容,预埋到客户端和服务端,然后在压缩和解压的时候使用该字典,可以让证书链完美“消失”。例如上表中使用 zstd + 字典时,压缩前的 Certficate 消息为 2666 字节,压缩后只有 18 字节。
开启证书压缩功能后,可以大大降低握手时的传输,尤其是使用字典时,例如 zstd + 字典时数据如下:
关闭证书压缩,握手共传输:3331 字节
开启证书压缩:握手共传输:698 字节
压缩率:698/3331 * 100% = 20.95%,握手带宽降低接近 80%。
结语
TLS 会话复用时不需要发送证书,所以,在完整握手时,就可以通过证书压缩来优化。在双向认证的场景下,即服务端开启了客户端认证,如果客户端和服务端都开启 TLS 证书压缩功能,压缩效果更明显,可以节省 TLS 握手中 80% 以上的带宽。后面 BabaSSL 还会支持 Compact TLS 1.3,即 TLS 1.3 的袖珍版,保持协议同构的前提下,占用最小的带宽。
原文链接
本文为阿里云原创内容,未经允许不得转载。
网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术的更多相关文章
- TLS握手优化详解
随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流.HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Laye ...
- SSL/TLS 握手优化详解
随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流.HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Layer ...
- 头显HTC Vive北美直降100美元,中国区降价活动今日公布
如果你现在想要购买一台VR头显,591ARVR资讯网www.591arvr.com的小编提醒大家可以等一等,在即将到来的年末促销中各种VR设备都将迎来大力度降价.目前北美市场的HTC Vive已经直降 ...
- TLS握手协议分析与理解——某HTTPS请求流量包分析
https://xz.aliyun.com/t/1039 HTTPS简介 HTTPS,是一种网络安全传输协议,在HTTP的基础上利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护 ...
- SSL/TLS协议详解(下)——TLS握手协议
本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...
- 使用Wireshark查看HTTPS中TLS握手过程
通过使用Wireshark抓包分析TLS握手的过程,可以更容易理解和验证TLS协议,本文将先介绍Wireshark解密HTTPS流量的方法,然后分别验证TLS握手过程和TLS会话恢复的过程. 一.使用 ...
- SSL/TLS 握手过程详解
在现代社会,互联网已经渗透到人们日常生活的方方面面,娱乐.经济.社会关系等都离不开互联网的帮助.在这个背景下,互联网安全就显得十分重要,没有提供足够的安全保障,人们是不会如此依赖它的.幸运的是,在大牛 ...
- SSL/TLS握手过程
----------------------------------专栏导航----------------------------------HTTPS协议详解(一):HTTPS基础知识 HTTPS ...
- 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证
SSL/TLS握手过程可以分成两种类型: 1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书.2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户 ...
- TLS握手协议
SSL/TLS基础 SSL(Secure Sockets Layer 安全套接层),及其继任者-传输层安全(Transport Layer Security, TLS)是为网络通信提供安全及数据完整性 ...
随机推荐
- 三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析
三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析 随着移动智能终端设备的不断发展和普及,如智能手机.平板电脑等,以及5G网络技术的推广应用,使得在这些设备上频繁使用三维地理空间数据 ...
- Python爬虫实战系列4:天眼查公司工商信息采集
Python爬虫实战系列1:博客园cnblogs热门新闻采集 Python爬虫实战系列2:虎嗅网24小时热门新闻采集 Python爬虫实战系列3:今日BBNews编程新闻采集 Python爬虫实战系列 ...
- uni-app如何实现USB插入后自动弹出对应软件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近碰到了一个奇葩需求,要用uni-app来实现usb接入设备的时候,让软件自动弹出来,这里给出我制作的过程和参考的各种思路,希望对大家有 ...
- C++ Concurrency in Action 读书笔记二:用mutex互斥锁保护在线程间共享的数据
Chapter 3 线程间共享数据 3.2 用互斥锁保护共享数据
- KingbaseES V8R6 等待事件之CLogControlLock
前言 Kingbase数据库的tuple行头部来标识这条记录的事务结束状态(未知.已提交.已回滚),在事务提交时如果并发更新100万行记录,需要对多个page的tuple进行更改,这种繁重的操作会对数 ...
- 在idea/webstorm等terminal运行命令报错:Command rejected by the operating system没有权限【已解决】
在idea/webstorm等编译器terminal窗口运行命令报错:Command rejected by the operating system没有权限[已解决] 1.修改terminal窗口 ...
- 【WCH以太网接口系列芯片】STM32+CH390+Lwip协议栈简单应用测试
本篇文章基于STM32F103和CH390H芯片进行例程移植及相关注意事项,简单验证TCP\UDP\Ping基础功能. 硬件:STM32F103开发板+沁恒CH390H的评估版图一示,SPI使用接口为 ...
- #位运算#CF959E Mahmoud and Ehab and the xor-MST
题目 \(n\)个点的完全图标号为\([0,n-1]\),\(i\)和\(j\)连边权值为\(i\: xor\:j\),求MST的值 分析 考虑MST有两种解法一种是Prim一种是Kruskal,Pr ...
- c++_shared库引入的问题
项目组提供了一个AAR文件供下游业务团队集成. 某天,下游团队反馈了一个紧急的问题,最终客户的开发者使用Android Studio打包时,构建工具提示构建失败,原因是存在重复的c++_shared库 ...
- 本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划项目自 2021 年 10 月 24 日上线以来,在开发者中引发高度关注. 成长计划 ...