nginx证书缓存功能

天翼云开发者社区
• 阅读 5

本文分享自天翼云开发者社区《nginx证书缓存功能》.作者:云海

背景:

ssl证书之前是不支持公用的,不同的域名,如果引用同一本证书,是无法公用的,每个域名都要加载同一个证书,浪费内存

新版本:

在1.27.2版本中,nginx官方更新了ssl证书相关的实现,支持了ssl证书缓存共享。

实现原理:

在配置初始化时,初始了ssl证书缓存的红黑树: ngx_openssl_cache_create_conf -> ngx_rbtree_init

在要获取ssl证书时,通过如下接口获取对应ssl证书: ngx_ssl_cache_fetch 该接口的index参数可以传递不同的标记位,因为不同功能ssl证书有不同的创建释放和引用增加处理 不同功能ssl证书有如下定义: typedef struct { ngx_ssl_cache_create_pt create; ngx_ssl_cache_free_pt free; ngx_ssl_cache_ref_pt ref; } ngx_ssl_cache_type_t;

核心函数分析:

void *
ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err,
    ngx_str_t *path, void *data)
{
    uint32_t               hash;              // 用于存储计算出的哈希值
    ngx_ssl_cache_t       *cache;             // 指向 SSL 缓存的指针
    ngx_ssl_cache_key_t    id;                // 缓存键,用于标识特定缓存项
    ngx_ssl_cache_type_t  *type;              // 缓存类型对象指针
    ngx_ssl_cache_node_t  *cn;                // 指向缓存节点的指针

    // 初始化缓存键(如失败则返回 NULL)
    if (ngx_ssl_cache_init_key(cf->pool, index, path, &id) != NGX_OK) {
        return NULL;
    }

    // 获取全局的 SSL 缓存对象
    cache = (ngx_ssl_cache_t *) ngx_get_conf(cf->cycle->conf_ctx,
                                             ngx_openssl_cache_module);

    // 根据索引获取对应的缓存类型
    type = &ngx_ssl_cache_types[index];

    // 计算缓存键的哈希值
    hash = ngx_murmur_hash2(id.data, id.len);

    // 在缓存中查找节点
    cn = ngx_ssl_cache_lookup(cache, type, &id, hash);
    if (cn != NULL) {
        // 如果找到节点,则调用类型的 ref 函数返回缓存值
        return type->ref(err, cn->value);
    }

    // 如果未找到,则分配一个新的缓存节点内存
    cn = ngx_palloc(cf->pool, sizeof(ngx_ssl_cache_node_t) + id.len + 1);
    if (cn == NULL) {
        return NULL; // 分配失败,返回 NULL
    }

    // 初始化缓存节点的属性
    cn->node.key = hash;                // 设置节点的哈希键
    cn->id.data = (u_char *)(cn + 1);   // 将 ID 数据存储在分配内存之后
    cn->id.len = id.len;                // 设置 ID 长度
    cn->id.type = id.type;              // 设置 ID 类型
    cn->type = type;                    // 设置节点的类型指针

    // 复制缓存键数据
    ngx_cpystrn(cn->id.data, id.data, id.len + 1);

    // 调用类型的 create 函数创建缓存值
    cn->value = type->create(&id, err, data);
    if (cn->value == NULL) {
        return NULL; // 创建失败,返回 NULL
    }

    // 将新节点插入到缓存的红黑树中
    ngx_rbtree_insert(&cache->rbtree, &cn->node);

    // 返回节点值的引用
    return type->ref(err, cn->value);
}

nginx官方此功能并没有开关控制,是默认开启的

点赞
收藏
评论区
推荐文章
陈占占 陈占占
3年前
Nginx+uWSGI+Django+SSL(https)安全证书中获取访问的IP地址信息
SECUREPROXYSSLHEADERSSL安全证书中的xforwardedforrequest.META.get("SECUREPROXYSSLHEADER")ifxforwardedfor:useripxforwardedfor.split(',')因为网站服务器会使用ngix等代理https(部署了SSL安全证书)
冴羽 冴羽
3年前
VuePress 博客优化之开启 HTTPS
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。注意此时,我们的域名还是,众所周知,开启HTTPS有很多好处,比如可以实现数据加密传输等,那我们如何开启HTTPS配置呢?1.购买证书阿里云提供了免费证书可以使用,在每个自然年内,都可以通过SSL证书服务一次性申领20张免费证书。1.1购买证书访问,选择「D
前端尾随者 前端尾随者
3年前
charles 手机证书下载安装
charles手机证书下载安装🌙手机阅读本文目录结构charles手机证书下载安装本文的Charles,适应windows/MAC/IOS/Android,避免抓包HTTPS失败和乱码;用的版本是V4.1.2,其它版本原理类似;charles如果不配置SSL通用证书;会导致HPPTS协议的域名抓取失败/乱码的现象;现在SSL越来越多,很多博客都上了SSL
高防加速CDN 高防加速CDN
2年前
为什么安装了SSL证书,网站还是显示不安全?
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。SSL证书就是遵守SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。由于http明文方式
Stella981 Stella981
4年前
Spring Boot前后端分离项目配置SSL证书——HTTPS
网站添加免费SSL证书——HTTPS协议一、SSL证书的下载SpringBoot前后端分离项目配置SSL证书,需要申请两个证书。前端申请网站主域名的SSL证书,后端可以在域名管理里面新建一个子域名。例如我的项目前端域名为:www.mzwhzy.com,后端域名为:b
Stella981 Stella981
4年前
Nginx 配置 HTTPS 服务器
Nginx配置HTTPS并不复杂,主要有两个步骤:签署第三方可信任的SSL证书 和 配置HTTPS签署第三方可信任的SSL证书关于SSL证书有关SSL的介绍可以参阅维基百科的传输层安全协议和阮一峰先生的 《SSL/TLS协议运行机制的概述》。SSL证书主要有两
Stella981 Stella981
4年前
Nginx 配置Https 协议
1\.去阿里云SSL证书购买证书!(https://oscimg.oschina.net/oscnet/3398ef872c4f1e56e01a1c79f270d756877.png) 2. 审核通过后下载nginx的ssl证书!(https://img2018.cnblogs.com/ibeta/1868441/202002/1
3A网络 3A网络
3年前
详解 SSL(二):SSL 证书对网站的好处
详解SSL(二):SSL证书对网站的好处在如今谷歌、百度等互联网巨头强制性要求网站HTTPS化的情况下,网站部署SSL证书已然成为互联网的发展趋势。而在上一篇《详解SSL(一):网址栏的小绿锁有什么意义?》中,我们也知道了SSL证书可以防止网络安全威胁。那么除此外为网站部署SSL证书还有哪些好处呢?最明显的一点,在我们部署SSL
3A网络 3A网络
3年前
详解 SSL(三):SSL 证书该如何选择?
详解SSL(三):SSL证书该如何选择?在上一篇《详解SSL(二):SSL证书对网站的好处》中,我们知道了在网站部署SSL证书后,不管是对网站本身还是对网站的用户都能够带来许多好处。那么随着HTTPS的普及,市面上也出现了各种不同的SSL证书。并且由于SSL证书的多样性,很多人对于如何选择SSL证书有着很大的困惑。因此,本篇文章
Kafka配置SASL_SSL认证传输加密
本文分享自天翼云开发者社区《》,作者:王帅一、SSL证书配置1、生成证书如我输入命令如下:依次是密码—重输密码—名与姓—组织单位—组织名—城市—省份—国家两位代码—密码—重输密码,后面告警不用管,此步骤要注意的是,名与姓这一项必须输入域名,如“localh
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
945
粉丝
16
获赞
40