TLS 握手带宽直降 80%,BabaSSL 是怎么做到的

ba48323507f281cb7589cbaa13f0acc3.gif

文|张成龙(花名:刻一 )

蚂蚁集团技术专家

负责 BabaSSL 密码库产品、OpenSSL 贡献者

本文 3085 字 阅读 5 分钟

|前言|

随着 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 还不支持。

PART. 1

TLS 证书压缩介绍

1186dd2c00bdb36b774916f8806bf36d.png

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

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

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

4、 客户端收到 CompressedCertificate 消息后,使用其中的 algorithm 解压,如果解压成功,则进行后续处理,否则关闭连接并发送 bad_certificate 警告。

服务端发送 CertificateRequest 消息,然后客户端发送 CompressedCertificate 消息的处理流程和上述类似,不再赘述。

标准中定义的压缩算法

ec685d537c9e351b2699c3a10d0ecdbc.png

除了 RFC 中定义的这 3 种算法,用户还可以使用其他算法,值 16384 到 65535 用于留给用户自已使用。

PART. 2

实战 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

PART. 3

测试压缩算法和压缩率

服务端配置证书链,CA 证书 + 中间 CA + 域名证书,TLS 1.3 握手且开启证书压缩,对比各个压缩算法的压缩率如下:

381be5de86f4e4dc635725e2170a48b7.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 :基于 Anolis OS,在整个系统软件层面(包括硬、固件、bootloader、内核以及 OS)实现以国密算法为主的全栈国密操作系统,结束一直以来国密算法生态碎片化的状况,在技术方面打造社区和生态,在资质合规方面致力于为行业提供基于国密的信息安全标准。

   本周推荐阅读   

ceb249cda181f0588f281702eb1aeae3.png

降本提效!注册中心在蚂蚁集团的蜕变之路


d549ae1e4535fb49d050a6591ff496b3.png

Prometheus on CeresDB 演进之路


99d935903f75f61ea313c6ba5431d2eb.png

如何在生产环境排查 Rust 内存占用过高问题


5aa9ac3697acdbda6680da9ec7682304.png

新一代日志型系统在 SOFAJRaft 中的应用


6b6fbdc2b9649d1ed49c5564ec1003c5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TLS握手过程中,签名和验签是非常重要的步骤。在引用中提到的TLS握手过程中,服务器和客户端会向CA机构发送申请证书文件,并分别得到各自的证书。这些证书包含了公钥和其他相关信息。在握手过程中,服务器和客户端会互相验证对方的身份并交换公钥。 在握手过程的某个阶段,引用中提到的certificate_verify步骤会发送使用客户端证书的签名结果。这个签名结果是对之前在握手过程中收到和发送的所有握手消息进行签名得到的。这样,服务器可以通过验证签名来确认客户端的身份和完整性。 数字签名是一种通过使用私钥对数据进行加密得到的签名,而验签则是通过使用公钥对签名进行解密和验证的过程。在TLS握手中,签名会被用来保证消息的完整性和身份的真实性。通过验证签名,服务器和客户端可以确保握手消息没有被篡改,并且可以信任对方的身份。 总结来说,TLS握手过程中的签名和验签是为了确保消息的完整性和身份的真实性。通过使用数字证书和数字签名,服务器和客户端可以相互验证对方的身份,并确保握手消息没有被篡改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [数字签名、服务器和客户端认证过程、TLS握手](https://blog.csdn.net/qq_43598865/article/details/120127173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [使用wireshark观察SSL/TLS握手过程--双向认证/单向认证](https://blog.csdn.net/weixin_29187895/article/details/117219168)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值