行編譯期切換)
后端網(wǎng)絡(luò)【免費(fèi)下載鏈接】cpp-httplibA C header-only HTTP/HTTPS server and client library項(xiàng)目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib點(diǎn)擊查看免費(fèi)下載本篇技術(shù)指南圍繞 cpp-httplib 的 TLS 能力展開(kāi)它本身不內(nèi)置任何 SSL/TLS 實(shí)現(xiàn)而是在編譯期通過(guò)宏從 OpenSSL、mbedTLS、wolfSSL 三個(gè)后端中選擇其一。讀完本文你將掌握三種后端的特性差異、編譯期宏開(kāi)關(guān)與鏈接方式、CMake/Makefile 下的實(shí)際構(gòu)建方法、多后端多構(gòu)建變體的維護(hù)策略以及 macOS 系統(tǒng)鑰匙串根證書(shū)自動(dòng)加載機(jī)制的原理與關(guān)閉方法。三種 TLS 后端一覽cpp-httplib 通過(guò)一個(gè)統(tǒng)一的抽象層屏蔽了各 TLS 庫(kù)的 API 差異但底層實(shí)現(xiàn)則由你選擇的宏決定。三個(gè)后端的對(duì)應(yīng)關(guān)系如下后端宏特點(diǎn)OpenSSLCPPHTTPLIB_OPENSSL_SUPPORT使用最廣泛、功能最全mbedTLSCPPHTTPLIB_MBEDTLS_SUPPORT輕量面向嵌入式場(chǎng)景wolfSSLCPPHTTPLIB_WOLFSSL_SUPPORT嵌入式友好可提供商業(yè)支持從源碼看httplib.h在文件頭部即通過(guò)這三個(gè)宏完成條件編譯分流每個(gè)后端對(duì)應(yīng)獨(dú)立的頭文件包含區(qū)httplib.h例如 OpenSSL 分支引入openssl/ssl.h、openssl/err.h等mbedTLS 分支引入mbedtls/ssl.h、mbedtls/x509_crt.h等wolfSSL 分支引入wolfssl/ssl.h與wolfssl/options.h。只要三者之一被定義httplib.h就會(huì)自動(dòng)推導(dǎo)出CPPHTTPLIB_SSL_ENABLEDhttplib.h從而啟用全部 TLS 相關(guān)類(lèi)與接口如SSLServer、SSLClient。編譯期選擇后端宏先行 鏈接后端庫(kù)在#include httplib.h之前定義對(duì)應(yīng)宏即可完成后端選擇#define CPPHTTPLIB_OPENSSL_SUPPORT #include httplib.h定義宏之后還必須把該后端的庫(kù)鏈接進(jìn)最終程序。不同后端的鏈接目標(biāo)各不相同OpenSSLlibssl、libcryptoOpenSSL 3.0 及以上版本見(jiàn) README.mdmbedTLSlibmbedtls、libmbedx509、libmbedcrypto2.x、3.x、4.x 均受支持并自動(dòng)檢測(cè)4.x 將libmbedcrypto更名為libtfpsacrypto見(jiàn) README.mdwolfSSLlibwolfssl5.x 受支持且要求 wolfSSL 以--enable-opensslall配置構(gòu)建見(jiàn) README.md。以項(xiàng)目自帶的 test/Makefile 為例三個(gè)后端的編譯鏈接參數(shù)分別組織為OPENSSL_SUPPORT -DCPPHTTPLIB_OPENSSL_SUPPORT -lssl -lcrypto MBEDTLS_SUPPORT -DCPPHTTPLIB_MBEDTLS_SUPPORT -lmbedtls -lmbedx509 -lmbedcrypto WOLFSSL_SUPPORT -DCPPHTTPLIB_WOLFSSL_SUPPORT -lwolfssl測(cè)試目標(biāo)通過(guò)把對(duì)應(yīng)變量傳入編譯命令從而為同一套 test.cc 生成三份不同后端的可執(zhí)行文件見(jiàn) test/Makefile 中的test-mbedtls、test-wolfssl等目標(biāo)。這也是官方驗(yàn)證“同一源碼、多后端可用”的實(shí)證方式。通過(guò) CMake 啟用如果使用項(xiàng)目提供的 CMake 構(gòu)建無(wú)需手寫(xiě)宏。CMakeLists.txt暴露了以下開(kāi)關(guān)見(jiàn) CMakeLists.txtHTTPLIB_USE_OPENSSL_IF_AVAILABLE默認(rèn) ON系統(tǒng)存在 OpenSSL 時(shí)自動(dòng)啟用HTTPLIB_USE_WOLFSSL_IF_AVAILABLE默認(rèn) OFFHTTPLIB_USE_MBEDTLS_IF_AVAILABLE默認(rèn) OFFHTTPLIB_REQUIRE_OPENSSL/HTTPLIB_REQUIRE_WOLFSSL/HTTPLIB_REQUIRE_MBEDTLS默認(rèn) OFF開(kāi)啟后若找不到對(duì)應(yīng)庫(kù)構(gòu)建直接失敗。CMake 探測(cè)成功后會(huì)把對(duì)應(yīng)宏寫(xiě)進(jìn)編譯定義并導(dǎo)出HTTPLIB_IS_USING_OPENSSL、HTTPLIB_IS_USING_WOLFSSL、HTTPLIB_IS_USING_MBEDTLS三個(gè)布爾變量供上層判斷CMakeLists.txt。安裝后還可通過(guò)find_package(httplib COMPONENTS OpenSSL wolfssl MbedTLS ZLIB Brotli zstd)按需引入組件CMakeLists.txt。源碼視角宏如何決定后端行為httplib.h對(duì)三個(gè)后端的分流貫穿全文件除了頭文件包含還包括哈希摘要、SSL 上下文管理、證書(shū)加載等實(shí)現(xiàn)區(qū)。例如MD5、SHA_256、SHA_512三個(gè)工具函數(shù)分別按CPPHTTPLIB_OPENSSL_SUPPORT/CPPHTTPLIB_MBEDTLS_SUPPORT/CPPHTTPLIB_WOLFSSL_SUPPORT三路實(shí)現(xiàn)httplib.hOpenSSL 走EVP_Digest*系列 APImbedTLS 走mbedtls_md5/mbedtls_sha256等4.x 則遷移到 PSA Crypto見(jiàn) httplib.h 中psa_crypto_init的一次性初始化邏輯wolfSSL 走 wolfcrypt 的wc_Sha256等 API??梢酝茢嗾麄€(gè)庫(kù)的 TLS 相關(guān)路徑——握手、會(huì)話、證書(shū)解析、WebSocket 的wss://支持——都是圍繞這三個(gè)宏組織起來(lái)的同一套公開(kāi) API。同時(shí)各后端都有版本門(mén)控避免誤用不兼容版本。比如 OpenSSL 分支在OPENSSL_VERSION_NUMBER 0x30000000L時(shí)直接#error拒絕 3.0 之前的版本mbedTLS 分支則根據(jù)MBEDTLS_VERSION_MAJOR自動(dòng)區(qū)分 2.x/3.x/4.x 的 API 差異httplib.h 與 httplib.h。如何選擇三個(gè)典型決策場(chǎng)景拿不準(zhǔn)就選 OpenSSL。它功能最豐富、文檔最完善。常規(guī)服務(wù)器部署或 Linux 桌面應(yīng)用從它開(kāi)始基本夠用一般不需要換。需要縮小二進(jìn)制體積或面向嵌入式設(shè)備時(shí)選 mbedTLS 或 wolfSSL。兩者都比 OpenSSL 緊湊得多能跑在內(nèi)存受限的設(shè)備上是嵌入式場(chǎng)景的主流選擇。需要商業(yè)支持時(shí)考慮 wolfSSL。wolfSSL 提供商業(yè)授權(quán)與技術(shù)支持適合需要將 TLS 能力隨產(chǎn)品交付并希望獲得廠商保障的團(tuán)隊(duì)。多后端支持按構(gòu)建變體維護(hù)實(shí)際項(xiàng)目中常見(jiàn)做法是把每個(gè)后端當(dāng)作一個(gè)“構(gòu)建變體build variant”用不同宏重新編譯同一份源碼例如 CI 中對(duì) test/test.cc 分別以三個(gè)宏編譯出三份測(cè)試二進(jìn)制test/Makefile 定義了TEST_ARGS/TEST_ARGS_MBEDTLS/TEST_ARGS_WOLFSSL。cpp-httplib 通過(guò)抽象層抹平了大部分 API 差異但三個(gè)后端并非 100% 行為一致——?jiǎng)?wù)必在發(fā)布前對(duì)每個(gè)目標(biāo)后端實(shí)際跑一遍測(cè)試尤其是證書(shū)解析與主機(jī)名校驗(yàn)這類(lèi)細(xì)節(jié)。一個(gè)已知的差異點(diǎn)是證書(shū)枚舉能力get_ca_certs()與get_ca_names()在 mbedTLS / wolfSSL 后端下只能列出通過(guò)load_ca_cert_store()加載的 CA通過(guò)set_ca_cert_path()或系統(tǒng)證書(shū)加載的證書(shū)無(wú)法枚舉見(jiàn) README.md。此外BoringSSL 也可以在CPPHTTPLIB_OPENSSL_SUPPORT下以盡力而為best-effort方式工作但它要求 C14 及以上且主機(jī)名校驗(yàn)僅支持 SAN見(jiàn) README.md??绾蠖艘恢碌墓?API無(wú)論選哪個(gè)后端以下能力都共享同一套接口無(wú)需改動(dòng)業(yè)務(wù)代碼證書(shū)校驗(yàn)控制自定義 CA、關(guān)閉校驗(yàn)、關(guān)閉主機(jī)名校驗(yàn)見(jiàn) T02. 控制 SSL 證書(shū)校驗(yàn)啟動(dòng) SSL/TLS 服務(wù)器SSLServer見(jiàn) T03. 啟動(dòng) SSL/TLS 服務(wù)器在服務(wù)端讀取對(duì)端客戶端證書(shū)見(jiàn) T05. 訪問(wèn)服務(wù)端的對(duì)端證書(shū)。正因?yàn)?API 統(tǒng)一選擇后端通常只是“換宏 換鏈接庫(kù)”業(yè)務(wù)層幾乎不用動(dòng)。macOS 系統(tǒng)鑰匙串根證書(shū)自動(dòng)加載在 macOS 上使用任一 OpenSSL 家族后端時(shí)cpp-httplib 會(huì)自動(dòng)從系統(tǒng)鑰匙串Keychain加載根證書(shū)這是通過(guò)CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN宏實(shí)現(xiàn)的且默認(rèn)開(kāi)啟。源碼中的觸發(fā)條件是__APPLE__且__clang__且未定義CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES同時(shí)定義了三個(gè) TLS 后端宏之一httplib.h。需要注意幾點(diǎn)邊界該自動(dòng)加載僅在 macOSTARGET_OS_OSX上生效若在 iOS/tvOS/watchOS 上誤定義了CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN編譯會(huì)直接報(bào)錯(cuò)提示應(yīng)改用set_ca_cert_path()顯式提供 CA bundlehttplib.h想關(guān)閉自動(dòng)加載只需定義#define CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES類(lèi)似地Windows 上默認(rèn)啟用 Schannel 根證書(shū)更新CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATEhttplib.h形成“開(kāi)箱即用”的系統(tǒng)證書(shū)集成體驗(yàn)。實(shí)戰(zhàn)小結(jié)選擇 TLS 后端對(duì) cpp-httplib 用戶來(lái)說(shuō)是一個(gè)純編譯期決策普通服務(wù)端與桌面應(yīng)用直接用CPPHTTPLIB_OPENSSL_SUPPORT起步嵌入式或體積敏感場(chǎng)景改用CPPHTTPLIB_MBEDTLS_SUPPORT或CPPHTTPLIB_WOLFSSL_SUPPORT需要商業(yè)支持則優(yōu)先 wolfSSL。宏定義、庫(kù)鏈接、CMake 開(kāi)關(guān)、版本門(mén)控與 macOS 鑰匙串行為都已在本倉(cāng)庫(kù)的 httplib.h、CMakeLists.txt 與 test/Makefile 中給出可直接參照的實(shí)現(xiàn)與構(gòu)建證據(jù)按“換宏 換鏈接庫(kù) 全量測(cè)試”三步走即可穩(wěn)妥落地。贊分享后端網(wǎng)絡(luò)【免費(fèi)下載鏈接】cpp-httplibA C header-only HTTP/HTTPS server and client library項(xiàng)目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib點(diǎn)擊查看免費(fèi)下載相關(guān)推薦libSQL 的 sqlite3-parser 上游同步機(jī)制從 SQLite 官方倉(cāng)庫(kù)到 Rust 移植版的變更同步映射與實(shí)踐libSQL 的 sqlite3 parser 上游同步機(jī)制從 SQLite 官方倉(cāng)庫(kù)到 Rust 移植版的變更同步映射與實(shí)踐 本文圍繞 vendored/s后端網(wǎng)絡(luò)libwebsockets TLS配置終極指南mbedTLS、OpenSSL和WolfSSL深度對(duì)比分析想要為你的libwebsockets項(xiàng)目選擇合適的TLS后端嗎 在這份完整的libwebsockets TLS配置指南中我們將深入分析mbedTLS、O后端網(wǎng)絡(luò)通信用 shard_map 編寫(xiě)顯式并行的 per-device 代碼JAX 手動(dòng) SPMD 并行編程實(shí)戰(zhàn)指南用 shard_map 編寫(xiě)顯式并行的 per device 代碼JAX 手動(dòng) SPMD 并行編程實(shí)戰(zhàn)指南 本文以 JAX 設(shè)計(jì)提案 docs/jep/142后端網(wǎng)絡(luò)上一篇Security-101 安全實(shí)踐與文檔體系政策、標(biāo)準(zhǔn)、基線、指南與程序的層次解析下一篇如何 30 分鐘跑通機(jī)器人學(xué)習(xí)框架LeRobot 上手與避坑實(shí)戰(zhàn)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考