网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术

简介: 为了保障数据的安全性,客户端会先和服务器进行 TLS 握手,有什么办法可以减少 TLS 握手的带宽消耗呢?

编者按:BabaSSL 是一款开源的密码库产品,在 GitHub 和龙蜥社区开源,并加入到龙蜥社区(OpenAnolis)的商密软件栈 SIG 组,且作为 Anolis 商密 OS 的核心组件之一。本文作者张成龙(刻一),是蚂蚁集团技术专家,负责BabaSSL密码库产品,也是OpenSSL贡献者之一。

bass.png

前言

随着 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 证书压缩介绍

图片.PNG

1、如果客户端支持证书压缩,在 ClientHello 消息中携带 compress_certificate 扩展,该扩展中包含支持的压缩算法列表;


2、服务端收到 ClientHello,发现对方支持证书压缩,如果服务端也支持证书压缩,同时支持客户端声明的压缩方法,则使用该算法压缩 Certificate 消息;


3、服务端发送 CompressedCertificate 消息,代替原来的 Certificate 消息,CompressedCertificate 消息中包含压缩算法,解压后的长度和压缩的 Certificate 消息;


4、 客户端收到 CompressedCertificate 消息后,使用其中的 algorithm 解压,如果解压成功,则进行后续处理,否则关闭连接并发送 bad_certificate 警告。服务端发送 CertificateRequest 消息,然后客户端发送 CompressedCertificate 消息的处理流程和上述类似,不再赘述。

标准中定义的压缩算法:

image.png

除了 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 握手且开启证书压缩,对比各个压缩算法的压缩率如下:

image.png

有些压缩算法是支持设置字典的,比如 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 的袖珍版,保持协议同构的前提下,占用最小的带宽。欢迎使用和关注 BabaSSL。


BabaSSL项目地址:

https://github.com/BabaSSL/BabaSSL


欢迎更多开发者加入商密软件栈SIG:

网址:https://openanolis.cn/sig/crypto

邮件列表:tc@lists.openanolis.cn

商密_1.png

—— 完 ——

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!

开发者社区.png

关于龙蜥社区

龙蜥社区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利性组织、个人等按照自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于2020年9月,旨在构建一个开源、中立、开放的Linux上游发行版社区及创新平台。

短期目标是开发龙蜥操作系统(Anolis OS)作为CentOS替代版,重新构建一个兼容国际Linux主流厂商发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。

龙蜥OS 8.4已发布,支持x86_64和ARM64架构,完善适配Intel、飞腾、海光、兆芯、鲲鹏芯片,并提供全栈国密支持。

欢迎下载:https://openanolis.cn/download

加入我们,一起打造面向未来的开源操作系统!

https://openanolis.cn

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
网络协议 Unix Linux
十几个免费好用的抓包工具
十几个免费好用的抓包工具
|
5月前
|
缓存 Java API
【揭秘】.NET高手不愿透露的秘密:如何让应用瞬间提速?
【8月更文挑战第28天】本文通过对比的方式,介绍了针对 .NET 应用性能瓶颈的优化方法。以一个存在响应延迟和并发处理不足的 Web API 项目为例,从性能分析入手,探讨了使用结构体减少内存分配、异步编程提高吞吐量、EF Core 惰性加载减少数据库访问以及垃圾回收机制优化等多个方面,帮助开发者全面提升 .NET 应用的性能和稳定性。通过具体示例,展示了如何在不同场景下选择最佳实践,以实现更高效的应用体验。
71 3
|
5月前
|
域名解析 缓存 网络协议
工作十年,很多网工连 CDN 原理都没搞懂!
工作十年,很多网工连 CDN 原理都没搞懂!
223 0
|
7月前
|
监控 搜索推荐 安全
蓝易云 - 关于站群服务器,读过这一篇就够了!
总的来说,站群服务器是一种强大的工具,但需要谨慎使用。你应该始终确保你的站群遵守所有适用的搜索引擎指南,并且始终为用户提供高质量的内容。
179 2
|
8月前
|
弹性计算 NoSQL 关系型数据库
全网都在讨论阿里云降价,这波操作给跪了!
全网都在讨论阿里云降价,这波操作给跪了!百款产品直降,平均降幅20%,阿里云希望通过此次大规模降价,让更多企业和开发者用上先进的公共云服务,加速云计算在中国各行各业的普及和发展。这次降价包括云服务器ECS、对象存储OSS、云数据库都降价了,真降价,直降价:百款产品直降,平均降幅20%,阿里云百科分享阿里云2024年降价信息汇总表
|
8月前
|
消息中间件 缓存 双11
阿里巴巴如何对抗淘宝双11亿级流量?这本P9纯手打并发手册送给你
淘宝双11,京东618,滴滴打车高峰如何抗住亿级的并发量? 这一份阿里P9纯手打的高并发系统设计手册帮你解决!这份手册分为基础篇、数据库篇、缓存篇、消息队列篇、分布式服务篇、维护篇、实战篇
|
算法 物联网 开发者
分享一个近期开源火爆全网的额温枪方案(硬件+源码)
分享一个近期开源火爆全网的额温枪方案(硬件+源码)
204 1
|
消息中间件 缓存 监控
GitHub热榜 这份《亿级流量并发手册》彻底揭开阿里高流量的秘密
前言 我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。 那我们改如何应对大流量的三种方式? 第一种方法:Scale-out。 第二种方法:使用缓存提升性能 第三种方法:异步处理 面试京东,阿里这些大厂遇到这些问题改怎么办? 秒杀时如何处理每秒上万次的下单请求? 如何保证消息仅仅被消费一次? 如何降低消息队列系统中消息的延迟? 而我今天给大家带来的这份《百亿级并发系统设计》是阿里内部的一份绝密文档,从基础开始,看
|
机器学习/深度学习 人工智能 自然语言处理
最早2026?全球优质语言数据「存量」告急!网友:杞人忧天
最早2026?全球优质语言数据「存量」告急!网友:杞人忧天
101 0

热门文章

最新文章