
后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载导读本篇是 cpp-httplib 官方 Tour 系列的第 7 章docs-src/pages/en/tour/07-https-server.md讲解如何把第 3 章学到的httplib::Server平滑升级为支持 TLS 的 HTTPS 服务端。你将掌握用一条 OpenSSL 命令生成自签名证书、用httplib::SSLServer搭建最小 HTTPS 服务、用curl与浏览器完成端到端验证以及客户端连接自签名服务器时关闭验证与把自签名证书当作 CA 信任两种方案的取舍。读完即可在自己的项目里落地一个可运行的 HTTPS 服务器。前置知识本篇默认你已完成第 5 章 TLS SetupOpenSSL/mbedTLS/wolfSSL 的编译配置与第 6 章 HTTPS Client。教程整体脉络可参考 Tour 目录。为什么需要 SSLServerHTTP 与 HTTPS 的切换点第 3 章 Basic Server 里我们注册路由后调用svr.listen(0.0.0.0, 8080)启动的是纯 HTTP 服务。启用 HTTPS 只需一步——把httplib::Server换成httplib::SSLServer并额外传入服务器证书与私钥两个文件路径| |httplib::Server|httplib::SSLServer| | -- | ------------------ | -------------------- | | 构造函数 | 无参数 | 证书与私钥路径 | | 协议 | HTTP | HTTPS | | 端口惯例 | 8080 | 8443 | | 路由 API | 相同 | 相同 |也就是说路由注册Get/Post/Put/Delete、请求对象req、响应对象res的用法与httplib::Server完全一致唯一的差别是构造函数与底层协议。从源码看SSLServer在 httplib.h 中正是class SSLServer : public Server它继承全部路由能力只额外负责 TLS 上下文的初始化ctx_、证书加载与握手后的加密通信process_and_close_socket。切换到 HTTPS 时只需把构造函数换成SSLServer svr(cert.pem, key.pem)即可路由代码一行都不用改。端口约定HTTPS 默认端口为 443客户端侧https://方案缺省值本例沿用教程惯例使用 8443 便于本机测试。创建自签名证书TLS 服务端必须向客户端证明自己的身份因此需要一对服务器证书 私钥。生产环境应由 CA证书颁发机构签发开发和测试阶段OpenSSL 一行命令即可生成自签名证书openssl req -x509 -noenc -keyout key.pem -out cert.pem -subj /CNlocalhost-x509直接生成自签名 X.509 证书而不是生成 CSR 请求-noenc私钥不加密不设密码方便本地自动加载-nodes是等价旧写法-keyout key.pem输出私钥文件-out cert.pem输出证书文件-subj /CNlocalhost证书主体名称CNlocalhost使证书与localhost域名匹配。命令产生两个文件cert.pem— 服务器证书公钥 身份信息key.pem— 私钥必须妥善保管不得外泄仓库的证书生成脚本 test/gen-certs.sh 展示了更完整的证书工程实践使用 2048 位 RSA 私钥、3650 天有效期、-sha256签名、Subject Alternative Name-extensions SAN扩展、加密私钥key_encrypted.pem、根 CA 客户端证书体系等可供需要更严谨测试环境时参考。最小 HTTPS 服务器拿到证书后编写服务器。路由 API 与第 3 章完全相同#define CPPHTTPLIB_OPENSSL_SUPPORT #include httplib.h #include iostream int main() { httplib::SSLServer svr(cert.pem, key.pem); svr.Get(/, [](const auto , auto res) { res.set_content(Hello, HTTPS!, text/plain); }); std::cout Listening on https://localhost:8443 std::endl; svr.listen(0.0.0.0, 8443); }要点宏CPPHTTPLIB_OPENSSL_SUPPORT必须在#include httplib.h之前定义否则SSLServer不会被编译进去。若使用 Mbed TLS / wolfSSL改为对应宏见 TLS Setup 的后端对照表构造函数参数顺序第一个是证书路径第二个是私钥路径。仓库 example/server.cc 中的实际写法与此一致并在构造后调用svr.is_valid()检查证书是否加载成功listen(0.0.0.0, 8443)0.0.0.0监听所有网卡仅本机访问可用127.0.0.1。listen()是阻塞调用直到进程收到 CtrlC 或从其他线程调用svr.stop()才返回详见 Basic Server。编译链接沿用第 5 章的配置# Linux clang -stdc17 -pthread -DCPPHTTPLIB_OPENSSL_SUPPORT \ -lssl -lcrypto -o server server.cpp # macOS (Homebrew OpenSSL) clang -stdc17 -DCPPHTTPLIB_OPENSSL_SUPPORT \ -I$(brew --prefix openssl)/include \ -L$(brew --prefix openssl)/lib \ -lssl -lcrypto \ -framework CoreFoundation -framework Security \ -o server server.cpp启动后服务监听在https://localhost:8443。用 curl 与浏览器验证服务器运行后用curl发起 HTTPS 请求。由于证书是自签名的、不在系统信任的 CA 列表里需要-k即--insecure跳过证书校验curl -k https://localhost:8443/ # Hello, HTTPS!若在浏览器打开https://localhost:8443会出现 This connection is not secure连接不安全警告——这是自签名证书的正常预期行为点击继续访问/高级即可放行。生产环境应使用受信任 CA 签发的证书消除该警告。客户端如何连接自签名服务器服务端就绪后用第 6 章的httplib::Client连接URL 使用https://方案。默认情况下客户端会验证服务器证书自签名证书必然校验失败因此需要二选一处理。方案一关闭证书验证开发期快捷方式#define CPPHTTPLIB_OPENSSL_SUPPORT #include httplib.h #include iostream int main() { httplib::Client cli(https://localhost:8443); cli.enable_server_certificate_verification(false); auto res cli.Get(/); if (res) { std::cout res-body std::endl; // Hello, HTTPS! } }enable_server_certificate_verification(false)等价于curl -k。它只适合开发/联调严禁在生产环境使用——关闭验证等于放弃对服务器身份的确认攻击者可通过中间人man-in-the-middle攻击伪装服务器窃取数据第 6 章 HTTPS Client 对此有同样警告。方案二把自签名证书指定为 CA 证书更安全更安全的做法是告诉客户端信任这张自签名证书本身#define CPPHTTPLIB_OPENSSL_SUPPORT #include httplib.h #include iostream int main() { httplib::Client cli(https://localhost:8443); cli.set_ca_cert_path(cert.pem); auto res cli.Get(/); if (res) { std::cout res-body std::endl; // Hello, HTTPS! } }set_ca_cert_path(cert.pem)把自签名证书加入受信任的 CA 列表。这样只有持有该证书对应私钥的服务器才能通过验证有效防止他人冒充对localhost测试场景而言证书身份验证依然完整生效。即使测试环境也请优先采用此方案。两条路径在底层均作用于证书校验链enable_server_certificate_verification控制是否执行握手后的证书校验对应源码 httplib.h 附近的ClientImpl实现而set_ca_cert_path则替换默认的信任锚列表CA bundle源码定义见 httplib.h。仓库的 example/client.cc 展示了生产风格写法——显式指定 CA 文件并开启校验测试套件 test/test.cc 中也能看到enable_server_certificate_verification(false)在本地测试环境的使用示例。两种方案的对比| | 方案一关闭验证 | 方案二指定 CA 证书 | | -- | -- | -- | | API |enable_server_certificate_verification(false)|set_ca_cert_path(cert.pem)| | curl 等价 |curl -k|curl --cacert cert.pem| | 校验行为 | 跳过证书校验 | 信任该证书并完整校验身份 | | 防冒充 | 否中间人风险 | 是 | | 适用场景 | 仅限临时开发调试 | 测试环境及任何可行的场景 |进阶SSLServer 构造参数与证书工程实践SSLServer的构造函数httplib.h比教程示例更丰富实际项目可按需使用SSLServer(const char *cert_path, const char *private_key_path, const char *client_ca_cert_file_path nullptr, // mTLS要求客户端证书 const char *client_ca_cert_dir_path nullptr, // 客户端 CA 目录 const char *private_key_password nullptr); // 加密私钥的密码client_ca_cert_file_path/client_ca_cert_dir_path开启双向 TLSmTLS要求客户端出示证书并校验仓库 test/test.cc 有带客户端 CA 的 SSLServer 测试用例详见教程 T04. mTLS 与 T03. SSL Serverprivate_key_password当私钥文件加密如openssl genrsa -passout pass:xxx生成时传入解密码仓库 test/gen-certs.sh 的key_encrypted.pem即此类场景is_valid()构造后务必检查返回值证书路径错误、格式不合法时它返回false参考 example/server.cc 的失败处理模式。下一步至此你已同时掌握 cpp-httplib 的 HTTP/HTTPS 客户端与服务端基础能力。若服务端需要实时双向通信可继续学习 Tour 第 8 章 WebSocket——WebSocket 同样支持wss://加密连接服务端在SSLServer上注册WebSocket处理器客户端使用wss://方案与本章的证书体系无缝衔接。赞分享后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载相关推荐Claude-Red漏洞分类学常见漏洞类的体系划分与真实案例Claude Red漏洞分类学常见漏洞类的体系划分与真实案例 Claude Red 是一个为 Claude 技能系统打造的攻防安全技能库它的 漏洞分类学 将后端网络xh 的 HTTPS 证书测试夹具客户端证书与自签名证书在 TLS 验证中的实战解析xh 的 HTTPS 证书测试夹具客户端证书与自签名证书在 TLS 验证中的实战解析 导读 本文以 xh 仓库中 tests/fixtures/certs/R开发工具curl证书管理自签名证书、CA证书、客户端证书curl证书管理自签名证书、CA证书、客户端证书 你是否曾经在使用curl进行HTTPS请求时遇到过证书验证错误是否对如何正确处理自签名证书、CA证书和客户CLI网络通信上一篇大麦自动抢票浏览器脚本Selenium 自动化指南下一篇Parsec VDD虚拟显示器完全配置指南从问题解决到高效应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考