尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

mbed TLS 2.4.2 构建与配置全指南:特性裁剪、多构建系统与 Monkey HTTP 服务集成

mbed TLS 2.4.2 构建与配置全指南:特性裁剪、多构建系统与 Monkey HTTP 服务集成 mbed TLS 2.4.2 构建与配置全指南特性裁剪、多构建系统与 Monkey HTTP 服务集成【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit导读本文以 fluent-bit 仓库内嵌的 mbed TLS 2.4.2 构建说明 为骨架系统讲解这一轻量级 TLS/SSL 库在 Linux/BSD/Windows 等平台上的配置、编译与测试方法包括通过config.h进行功能裁剪、四种构建系统yotta / Make / CMake / Visual Studio的使用细节、多构建模式Release、Debug、ASan、MemSan 等的选择以及预置裁剪配置的两种套用方式。读完本文你将能够独立完成 mbed TLS 的定制编译并理解它在当前仓库中作为 Monkey HTTP 服务器 TLS 后端MK_TLS_BACKENDmbedtls的集成原理。一、mbed TLS 是什么它在这份仓库中扮演什么角色mbed TLSARM mbed TLS是一个面向嵌入式与资源受限环境的轻量级 TLS/SSL 库同时提供加密、X.509 证书解析与 TLS 协议实现。它的目标场景决定了它的两大设计取向可裁剪所有功能通过 include/mbedtls/config.h 中的宏开关控制按需启用模块以缩小体积可移植仅依赖标准 C 与少量平台抽象便于移植到不同 OS、架构与编译环境。在本仓库中该库位于lib/monkey/deps/mbedtls-2.4.2/是 Monkey HTTP 服务器 的第三方依赖之一。Monkey 的顶层 CMakeLists.txt 通过MK_MBEDTLS_SHARED是否使用 mbedtls 共享库和MK_TLS_BACKENDTLS 后端auto/openssl/mbedtls两个选项接入该库。也就是说构建 Fluent Bit 时选择 Monkey 的 TLS 后端为mbedtls即可用这份内嵌源码为 HTTP 服务提供 HTTPS 能力无需依赖系统 OpenSSL。从仓库实际快照看此处保留了configs/、include/、library/三个核心目录顶层文件列表对应 README 中“配置、头文件、库源码”三大部分而programs/示例程序、tests/测试套件与scripts/辅助脚本属于上游完整发行版的组成部分未随本仓库快照打包下文涉及时会特别注明。二、Configuration一切裁剪从 config.h 开始mbed TLS 在绝大多数系统上可以直接编译“build out of the box”。需要平台定制时核心入口是带完整注释的配置文件 include/mbedtls/config.h它同时也是功能开关的选择器每个MBEDTLS_XXX_C宏对应一个实现模块如MBEDTLS_AES_C启用 AES、MBEDTLS_SSL_TLS_C启用 TLS 协议栈每个MBEDTLS_XXX_ENABLED宏对应一种协议/算法特性如MBEDTLS_KEY_EXCHANGE_RSA_ENABLED、MBEDTLS_SSL_PROTO_TLS1_2关闭不用的模块可以显著减少二进制体积与内存占用这正是嵌入式裁剪的核心手段。修改该文件有两种方式手工编辑直接增删#define/#undef脚本化修改使用上游发行版提供的 Perl 脚本scripts/config.pl--help查看用法可编程地查询、启用或禁用配置项。编译器的选择与参数则通过常规环境变量传入例如CC指定编译器、CFLAGS追加编译选项在 Make 与 CMake 构建系统下均生效。README 给出的换编译器示例为CCgcc CFLAGS-fstack-protector-strong -Wa,--noexecstack cmake .其中-fstack-protector-strong开启栈保护-Wa,--noexecstack标记堆栈不可执行是面向安全加固场景的典型组合。需要注意本仓库的 mbedtls 快照未包含scripts/目录因此scripts/config.pl仅存在于上游完整发行版中若要在当前仓库内做配置裁剪请直接手工编辑 include/mbedtls/config.h。三、编译四种构建系统与三大库的依赖关系mbed TLS 2.4.2 官方维护四种构建系统构建系统定位状态yottambed OS 16.03 的包管理与构建系统提供默认最小配置随目标平台启用 mbed OS 特性Make开发主用系统之一仅使用最小 Make 语法完整且持续更新CMake开发主用系统之一完整且持续更新Microsoft Visual StudioVS6 / VS2010 工程文件跟随 CMake/Make 的变更同步CMake 与 Make 是开发主力功能始终完整、最新另外两者不一定自动同步所有新特性。三大库与链接顺序Make 与 CMake 均产出以下三个库libmbedcrypto底层加密算法库AES、RSA、ECC、哈希、随机数等libmbedx509X.509 证书解析与验证库依赖libmbedcryptolibmbedtlsTLS/SSL 协议栈依赖libmbedx509与libmbedcrypto。依赖链为libmbedtls → libmbedx509 → libmbedcrypto因此GNU 链接器要求库标志按序书写-lmbedtls -lmbedx509 -lmbedcrypto使用dlopen()动态加载共享库时必须先加载libmbedcrypto再加载libmbedx509最后才能加载libmbedtls。这一结构在仓库的 library/CMakeLists.txt 中有直接印证它分别构建mbedcrypto、mbedx509、mbedtls三个 target并声明mbedtls链接libs与mbedx509最后通过add_custom_target(lib DEPENDS mbedcrypto mbedx509 mbedtls)汇总为统一的lib目标。3.1 Yotta 构建mbed OS 场景yotta 是 mbed 团队开发的包管理器兼构建系统也是 mbed OS 16.03 的默认构建方式。安装 yotta 后# 从 yotta registry 下载并构建最新 mbedtls yotta install mbedtls yotta build若已从源码例如克隆仓库或下载独立发行包获得一份 mbed TLS则需要先生成 yotta 模块# 在 mbed TLS 项目根目录执行 yotta/create-module.sh # 生成的模块位于 yotta/module 目录 cd yotta/module yotta build构建前通常还要设置 yotta target除非已全局设置。yotta 版默认提供最小化配置文件且可能根据目标平台在示例与测试中启用 mbed OS 特性。3.2 Make 构建mbed TLS 刻意只使用“最小化”的 Make 语法因为大量 Make 特性在不同实现或平台上并不通用——这意味着在个别平台上Makefile 可能需要手工微调或设置 export 语句才能正常工作。基本流程# 编译 make # 编译并运行测试测试需要 Perl make check # 无 Perl 环境时跳过测试构建 make no_test # 仍可运行小规模自检程序programs/test/selftest面向 Windows 平台的两个关键变量WINDOWS_BUILD1目标是 Windows但构建环境是类 Unix如交叉编译、MSYS shell时使用WINDOWS1构建环境本身就是 Windows shell如使用 mingw32-make时使用此时部分 target 不可用。其他常用变量SHARED在静态库之外额外构建共享库DEBUG进行调试构建CFLAGS/LDFLAGS可在环境或命令行覆盖覆盖时-I等关键参数仍会被保留WARNING_CFLAGS可单独覆盖告警选项。遇到平台问题时可检查library/、programs/、tests/下的 Makefile按平台增删选项。3.3 CMake 构建CMake 是当前仓库实际使用的构建方式Monkey 与 Fluent Bit 均以 CMake 驱动。基本流程cmake . make运行测试make test关键 CMake 选项选项作用-DENABLE_TESTINGOff无 Perl 时关闭测试套件测试构建依赖 Perl 生成用例文件-DUSE_SHARED_MBEDTLS_LIBRARYOn构建共享库版本-DCMAKE_BUILD_TYPE模式切换构建模式见下表-DENABLE_PROGRAMS控制是否构建示例程序默认 ON见 CMakeLists.txt-DENABLE_ZLIB_SUPPORT启用 zlib 压缩支持默认 OFF-DUNSAFE_BUILDON显式确认可以构建不安全的测试配置见下关闭测试套件后若仍保留示例程序可以用programs/test/selftest运行小规模自检。安全护栏CMake 构建在发现配置了MBEDTLS_TEST_NULL_ENTROPY测试用“空熵源”完全不适合生产时会输出醒目警告并默认以FATAL_ERROR终止构建只有显式传入-DUNSAFE_BUILDON才允许继续。这组逻辑完整地写在 mbedtls-2.4.2/CMakeLists.txt从中可以读出项目对“配置即安全边界”的坚持。构建模式Build Modes多数适用于 gcc 与 clang部分为编译器特有模式说明Release默认代码二进制中不含多余信息Debug生成调试信息并关闭优化Coverage在调试信息基础上生成代码覆盖率信息ASan用 AddressSanitizer 检测内存错误新版 gcc/clang 还包含 LeakSanitizer新版 clang 额外启用 UndefinedSanitizerASanDbg同 ASan但更慢带调试信息与更好的栈回溯MemSan用 MemorySanitizer 检测未初始化内存读取实验性需要 Linux/x86_64 上的新版 clangMemSanDbg同 MemSan更慢带调试信息、更好栈回溯与来源追踪origin trackingCheck启用依赖优化的编译器告警并把所有告警当作错误切换模式示例Debugcmake -D CMAKE_BUILD_TYPEDebug .列出全部可用的 CMake 选项cmake -LH更换编译器/选项需清缓存CMake 运行过一次后若想更换编译器或编译选项必须先清除 CMake 缓存再重新配置find . -iname *cmake* -not -name CMakeLists.txt -exec rm -rf {} CCgcc CFLAGS-fstack-protector-strong -Wa,--noexecstack cmake .该命令中rm -rf仅清理构建缓存目录不涉及源码。3.4 Microsoft Visual Studio 构建工程文件面向 Visual Studio 2010 生成解决方案文件mbedTLS.sln包含构建库与所有程序所需的全部基础工程tests/下的测试文件因需要 Perl 环境默认不生成、不编译但programs/test/下的selftest程序仍然可用。四、示例程序与测试体系4.1 示例程序programs/上游发行版的programs/目录针对不同特性与使用场景提供了大量示例程序绝大多数只聚焦单一特性或单一用法适合作为“拷贝式”学习素材。README 特别提醒复制其中代码时要注意这一点组合场景需自行整合。如前所述本仓库的 mbedtls 快照未包含programs/目录。4.2 测试套件tests/mbed TLS 在tests/中内置了庞大的测试套件其生成机制很特别测试文件如test_suite_mpi.c由两类源文件生成function 文件如suites/test_suite_mpi.function存放测试函数data 文件如suites/test_suite_mpi.data存放测试用例即传给测试函数的参数列表初始生成需要 Perl因此 README 才反复强调“测试依赖 Perl”。在具备 Unix shell 与 OpenSSL可选 GnuTLS的机器上还提供额外测试脚本脚本职责tests/ssl-opt.sh各类 TLS 选项重协商、会话恢复等的集成测试并测试与其它实现的互操作tests/compat.sh测试每个密码套件与其它实现的互操作性tests/scripts/test-ref-configs.pl在各种精简配置下做构建测试tests/scripts/key-exchanges.pl在仅启用单一密钥交换的配置下做构建测试tests/scripts/all.sh组合运行以上测试并附加更多如 ASan、完整 config.h 等不同构建选项五、configs/面向特定场景的预置裁剪配置configs/目录提供若干“非标准”配置各自聚焦特定使用场景目标是在满足该场景需求的前提下把资源占用压到最低可直接作为自定义配置的起点。目录说明见 configs/README.txt。这些文件是默认config.h的完整替代品。使用方式有两种方式一直接替换默认配置文件将选中的配置复制/替换为 include/mbedtls/config.h。替换后若编译报错可能需要在配置文件中调整#include mbedtls/check_config.h所在行。方式二通过MBEDTLS_CONFIG_FILE宏指定配置文件推荐可把自定义配置放在树外# Make 方式 CFLAGS-I$PWD/configs -DMBEDTLS_CONFIG_FILEfoo.h make# CMake 方式先清缓存 find . -iname *cmake* -not -name CMakeLists.txt -exec rm -rf {} CFLAGS-I$PWD/configs -DMBEDTLS_CONFIG_FILEfoo.h cmake . make方式二同样适用于把自定义配置文件放在 mbed TLS 源码树之外的情况——只需让-I指向配置文件所在目录。本仓库快照中保留了五个示例配置完整列表见 configs/它们展示了“按场景最小化”的思路config-mini-tls1_1.h仅实现 TLS 1.1RFC 4346必需密码套件MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA的最小配置。从 源码 可以看到它只启用了MBEDTLS_AES_C、MBEDTLS_DES_C、MBEDTLS_RSA_C、MBEDTLS_SHA1_C、MBEDTLS_SSL_PROTO_TLS1_1等少量模块config-ccm-psk-tls1_2.h面向 PSK预共享密钥 CCM 模式 TLS 1.2 的组合配置 中通过MBEDTLS_KEY_EXCHANGE_PSK_ENABLED、MBEDTLS_AES_C、MBEDTLS_CCM_C、MBEDTLS_SSL_PROTO_TLS1_2构建一个紧凑的 PSK 方案并把MBEDTLS_PSK_MAX_LEN限制为 16 字节128 位密钥通常够用config-picocoin.h、config-suite-b.hSuite B 密码套件、config-thread.h多线程场景则分别对应比特币轻客户端类应用、政府级算法组合、线程安全等不同目标。这些文件的结构完全一致先是“系统支持”如MBEDTLS_HAVE_ASM、MBEDTLS_HAVE_TIME再是“特性开关”如MBEDTLS_CIPHER_MODE_CBC、MBEDTLS_KEY_EXCHANGE_XXX_ENABLED最后是“模块清单”MBEDTLS_XXX_C——照此组织方式即可编写自己的精简配置。六、移植 mbed TLSmbed TLS 可以移植到众多架构、操作系统与平台。移植前值得先厘清两个问题目标环境的外部依赖有哪些、配置如何适配新平台。对嵌入式移植而言重点是MBEDTLS_HAVE_XXX系列宏是否具备时间、汇编、特定系统调用等能力与平台相关的熵源实现。在库源码中与平台打交道的关键文件位于 library/如entropy_poll.c、net_sockets.c而对外依赖的声明集中在 include/mbedtls/config.h 中。七、从构建指南到仓库集成Monkey 的 TLS 后端选择回到当前仓库的实际用途这份 mbed TLS 快照是被 Monkey HTTP 服务器 以“依赖deps”形式引入的。Monkey 的 CMakeLists.txt 中与 mbed TLS 直接相关的构建入口为option(MK_MBEDTLS_SHARED Use mbedtls shared lib No) set(MK_TLS_BACKEND auto CACHE STRING TLS backend: auto, openssl, or mbedtls) set_property(CACHE MK_TLS_BACKEND PROPERTY STRINGS auto openssl mbedtls)也就是说构建 Fluent Bit其内嵌 Monkey 提供 HTTP/TLS 能力时可以通过-DMK_TLS_BACKENDmbedtls强制使用本仓库内置的 mbed TLS而不是依赖系统 OpenSSLMK_MBEDTLS_SHARED则决定链接静态还是共享版本。这与 README 中“Make/CMake 会产出 libmbedcrypto / libmbedx509 / libmbedtls 三个库”的说明相互印证——集成方只需按 library/CMakeLists.txt 生成的目标进行链接即可。因此在深入 Fluent Bit / Monkey 的 HTTPS 配置之前先按本文方法完成 mbed TLS 的特性裁剪与编译是理解其 TLS 栈行为的第一步。八、小结与上手建议mbed TLS 2.4.2 的构建哲学可以概括为三条配置先行一切能力由 config.h 的宏决定裁剪越精准体积与内存收益越大构建系统自治CMake/Make 是官方主推且始终完整的两条路径yotta 面向 mbed OSVS 工程面向 Windows 传统开发者测试闭环function data 文件生成测试套件的机制配合ssl-opt.sh、compat.sh等互操作测试保证了裁剪配置下的正确性。实际操作建议在具备 Perl 的机器上用make check/make test跑一遍完整测试验证环境需要精简体积时从 configs/ 挑选最接近的场景配置用MBEDTLS_CONFIG_FILE方式接入无需改动默认头文件在 Fluent Bit / Monkey 体系中通过-DMK_TLS_BACKENDmbedtls选择内置 TLS 后端即可复用本仓库这一份源码无需系统级安装依赖。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表