网不好怎么办?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是怎么做到的?| 龙蜥技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TDA-04D8变送器数据上报阿里云
- 下一篇: 移动云正式发布基于龙蜥 Anolis O