乐趣区

关于devops:网不好怎么办TLS握手带宽直降80BabaSSL是怎么做到的-龙蜥技术

简介:为了保障数据的安全性,客户端会先和服务器进行 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 的袖珍版,放弃协定同构的前提下,占用最小的带宽。

原文链接
本文为阿里云原创内容,未经容许不得转载。

退出移动版