Ubuntu 下 nginx-1.24.0 源码分析 - ngx_ssl_version 函数

news/2025/2/12 5:38:25/

定义

event\ngx_event_openssl.h 中:

#if (OPENSSL_VERSION_NUMBER >= 0x10100001L)#define ngx_ssl_version()       OpenSSL_version(OPENSSL_VERSION)#else#define ngx_ssl_version()       SSLeay_version(SSLEAY_VERSION)#endif

#if (OPENSSL_VERSION_NUMBER >= 0x10100001L)

预处理指令,用于条件编译 ,

检查 OPENSSL_VERSION_NUMBER 是否大于或等于 0x10100001L(OpenSSL 1.1.0 版本对应的十六进制常量)

根据 OpenSSL 的版本号,决定使用不同的版本获取函数。这是为了确保代码与不同版本的 OpenSSL 兼容

OpenSSL 的版本号是通过一个宏 OPENSSL_VERSION_NUMBER 来表示的,这个宏的值是一个十六进制常量,它编码了 OpenSSL 的版本信息。

OpenSSL_version() 是 OpenSSL 1.1.0 新增的 API,用于获取版本信息。

OPENSSL_VERSION 是参数,表示需要获取完整的版本字符串

OPENSSL_VERSION_NUMBER

定义在 event\ngx_event_openssl.h

#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L)
#undef OPENSSL_VERSION_NUMBER
#if (LIBRESSL_VERSION_NUMBER >= 0x2080000fL)
#define OPENSSL_VERSION_NUMBER  0x1010000fL
#else
#define OPENSSL_VERSION_NUMBER  0x1000107fL
#endif
#endif

这段代码是 Nginx 源码中用于处理 LibreSSL 和 OpenSSL 版本兼容性问题的部分。

#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L)

defined LIBRESSL_VERSION_NUMBER

检查是否定义了 LIBRESSL_VERSION_NUMBER 宏。

这个宏通常在使用 LibreSSL 的时候会被定义,表明当前环境使用的是 LibreSSL 而非 OpenSSL。

OPENSSL_VERSION_NUMBER == 0x20000000L

检查 OPENSSL_VERSION_NUMBER 是否等于 0x20000000L

这个常量可能是一个特殊的占位值或标识符,通常用于区分 LibreSSL 和 OpenSSL 的版本

 第三方库 openssl/opensslv.h 中定义了 OPENSSL_VERSION_NUMBER

用以下代码去输出它的值:

#include <stdio.h>
#include <openssl/opensslv.h>int main() {printf("OPENSSL_VERSION_NUMBER: 0x%lx\n", OPENSSL_VERSION_NUMBER);return 0;
}

 

没有 LIBRESSL_VERSION_NUMBER 的定义 

#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L)

条件不成立

OPENSSL_VERSION_NUMBER 的值还是 0x30000020

#if (OPENSSL_VERSION_NUMBER >= 0x10100001L)

这个条件就成立

于是 ngx_ssl_version 的定义是这个


#define ngx_ssl_version()       OpenSSL_version(OPENSSL_VERSION)

 可用以下代码查看 OPENSSL_VERSION 的值: 

#include <stdio.h>
#include <openssl/crypto.h>int main() {printf("OPENSSL_VERSION: %d\n", OPENSSL_VERSION);return 0;
}

用以下代码去使用以下 OpenSSL_version(OPENSSL_VERSION) 看一下效果

在编译时,需要使用 -lcrypto-lssl 选项来链接 OpenSSL 的库

#include <stdio.h>
#include <openssl/crypto.h>
#include <openssl/opensslv.h>int main() {printf("OPENSSL_VERSION: %s\n", OpenSSL_version(OPENSSL_VERSION));return 0;
}

#undef OPENSSL_VERSION_NUMBER

取消定义 OPENSSL_VERSION_NUMBER

如果满足前面的条件(即当前环境是 LibreSSL 并且 OPENSSL_VERSION_NUMBER 被设置为 0x20000000L),则取消它的定义。这是因为需要重新定义 OPENSSL_VERSION_NUMBER 为一个更合理的值,以适应 Nginx 的版本检查逻辑

#if (LIBRESSL_VERSION_NUMBER >= 0x2080000fL)

LIBRESSL_VERSION_NUMBER >= 0x2080000fL: 

检查 LibreSSL 的版本号是否大于或等于 0x2080000fL

如果 LibreSSL 的版本号足够新,则执行接下来的代码块。这个版本号的编码格式通常与 LibreSSL 的内部版本表示有关,0x2080000fL 对应的是一个特定的 LibreSSL 版本。

#define OPENSSL_VERSION_NUMBER  0x1010000fL

定义 OPENSSL_VERSION_NUMBER0x1010000fL 

如果 LibreSSL 的版本号 >= 0x2080000fL,则将 OPENSSL_VERSION_NUMBER 设置为 0x1010000fL。这个值对应的是 OpenSSL 1.1.0 的版本号(或者类似的功能集合),目的是让 Nginx 在处理 LibertySSL 的时候,能够伪造成 OpenSSL 1.1.0 的版本,从而兼容某些依赖于 OpenSSL 版本号的逻辑。

#else

预处理指令,表示如果第 3 行的条件不成立(即 LibreSSL 的版本号 < 0x2080000fL),则执行接下来的代码块 

#define OPENSSL_VERSION_NUMBER  0x1000107fL

http://www.ppmy.cn/news/1570756.html

相关文章

设计模式-责任链模式:让请求像流水线一样自由流转

🔍 引言:为什么需要责任链模式? 场景痛点: 想象一个请假审批系统: 普通员工请假 ≤3天 → 组长审批3天 < 请假 ≤7天 → 经理审批请假 >7天 → CEO审批如果用传统的if-else实现: if (days <= 3) {groupLeader.approve(); } else if (days <=7) {manager.a…

C# OpenCV机器视觉:多尺度细节提升

在一个充满创意的设计工作室里&#xff0c;阿强正对着电脑屏幕上的图像唉声叹气。他是一名图像处理师&#xff0c;最近接到一个棘手的任务&#xff0c;客户拿来的图像细节模糊&#xff0c;看起来灰蒙蒙的&#xff0c;就像被一层薄纱蒙住了眼睛。 “这图像细节这么差&#xff0…

【AI日记】25.02.08

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 探索 AI 应用探索周二有个面试&#xff0c;明后天打算好好准备一下&#xff0c;我打算主要研究下 AI 如何在该行业赋能和应用&#xff0c;以及该行业未来的发展前景和公司痛点&#…

android studio无痛入门

在Android Studio中创建和管理项目主要涉及以下几个步骤&#xff1a; 1. 创建新项目 打开Android Studio&#xff0c;点击“Start a new Android Studio project”或者“File” > “New” > “New Project”。 选择一个模板&#xff0c;例如“Empty Activity”&#xff0…

响应式编程库Reactor(一)

响应式编程库Reactor 一、官方文档二、什么是响应式编程2.1. 阻塞是对资源的浪费2.2. 异步可以解决问题吗&#xff1f;2.3. 从命令式编程到响应式编程2.3.1. 可编排性与可读性2.3.2. 就像装配流水线2.3.3. 操作符&#xff08;Operators&#xff09;2.3.4. subscribe() 之前什么…

【从零开始入门unity游戏开发之——C#篇48】C#补充知识点——静态导入、异常捕获和异常筛选器、nameof运算符

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

Excel中对单列数据进行去重筛选

在Excel中对单列数据进行去重筛选&#xff0c;可以按照以下步骤操作&#xff1a; 方法一&#xff1a;使用“删除重复项”功能 选择数据列&#xff1a;点击要处理的列头&#xff08;如A列&#xff09;。打开“删除重复项”&#xff1a; Excel 2007及以后版本&#xff1a;点击“…

Mac 终端命令大全

—目录操作— ꔷ mkdir 创建一个目录 mkdir dirname ꔷ rmdir 删除一个目录 rmdir dirname ꔷ mvdir 移动或重命名一个目录 mvdir dir1 dir2 ꔷ cd 改变当前目录 cd dirname ꔷ pwd 显示当前目录的路径名 pwd ꔷ ls 显示当前目录的内容 ls -la ꔷ dircmp 比较两个目录的内容 di…