跳到主要内容

证书压缩API

功能简介

证书压缩,即Certificate Compression,是定义在RFC 8879,提供了一种对TLS握手过程中Certificate消息的压缩能力,从而实现减小TLS握手字节传输数量的目的。

数据结构和头文件

#include <openssl/ssl.h>

typedef int (*SSL_cert_compress_cb_fn)(SSL *s,
const unsigned char *in, size_t inlen,
unsigned char *out, size_t *outlen);
typedef int (*SSL_cert_decompress_cb_fn)(SSL *s,
const unsigned char *in, size_t inlen,
unsigned char *out, size_t outlen);

函数指针说明:

SSL_cert_compress_cb_fn指向一个执行实际压缩动作的函数,该函数对in和inlen所定义的数据进行压缩,并将结果通过out和outlen返回。如果out为NULL,则该函数应当通过outlen返回计算后的压缩数据长度。该函数成功时返回1,失败时返回0.

SSL_cert_decompress_cb_fn的功能和SSL_cert_compress_cb_fn类似,不过提供的是解压缩的能力。

压缩算法定义:

TLSEXT_cert_compression_zlib
TLSEXT_cert_compression_brotli
TLSEXT_cert_compression_zstd

以上三个宏分别对应ZLIB, Brotli和Zstandard三种压缩算法,这些压缩算法也是铜锁的证书压缩功能所支持的。

SSL_add_cert_compression_alg

函数原型

 int SSL_add_cert_compression_alg(SSL *s, int alg_id,
SSL_cert_compress_cb_fn compress,
SSL_cert_decompress_cb_fn decompress);

该函数向SSL对象s注册一组证书压缩算法的接口,包括对Certtificate消息进行压缩处理的compress回调函数,以及对CompressedCertifcate消息进行解压缩处理的decompress回调函数。压缩算法是通过alg_id参数指定的。

函数参数

参数类型说明
sSSL
alg_idint#DzCwD
compressSSL_cert_compress_cb_fn
decompressSSL_cert_decompress_cb_fn

示例

返回值

返回值含义说明
1成功
0失败

版本信息

Tongsuo/BabaSSL 8.3.0以及之后版本支持此特性。

注意事项

SSL_CTX_add_cert_compression_alg

函数原型

 int SSL_CTX_add_cert_compression_alg(SSL_CTX *ctx, int alg_id,
SSL_cert_compress_cb_fn compress,
SSL_cert_decompress_cb_fn decompress);

该函数是SSL_add_cert_compression_alg的变种版本,该函数是向一个SSL_CTX对象设置压缩和解压缩回调函数。

函数参数

参数类型说明
ctxSSL_CTX
alg_idint#DzCwD
compressSSL_cert_compress_cb_fn
decompressSSL_cert_decompress_cb_fn

示例

#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;
}

返回值

返回值含义说明
1成功
0失败

版本信息

Tongsuo/BabaSSL 8.3.0以及之后版本支持此特性。

注意事项

SSL_get_cert_compression_compress_id

函数原型

int SSL_get_cert_compression_compress_id(SSL *s);

该函数返回当前SSL对象s中所使用的压缩算法序号。

函数参数

参数类型说明
sSSL

示例

返回值

返回值含义说明
int压缩算法号码该整数是一个压缩算法的号码
0没有使用任何压缩算法

版本信息

Tongsuo/BabaSSL 8.3.0以及之后版本支持此特性。

注意事项

SSL_get_cert_compression_compress_id

函数原型

int SSL_get_cert_decompression_compress_id(SSL *s);

该函数返回当前SSL对象s中所使用的解压缩算法序号。

函数参数

参数类型说明
sSSL

示例

返回值

返回值含义说明
int解压缩算法号码该整数是一个压缩算法的号码
0没有使用任何压缩算法

版本信息

Tongsuo/BabaSSL 8.3.0以及之后版本支持此特性。

注意事项