You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++代码中为curlpp硬编码自定义SSL证书防MITM攻击

实现硬编码SSL证书让curlpp仅信任该证书

核心思路

将目标SSL证书以PEM格式直接硬编码为字符串常量,通过curlpp的SslCaBlob选项(对应libcurl的CURLOPT_CAINFO_BLOB)传入证书数据,同时禁用系统默认CA证书池,确保仅信任指定证书。


步骤1:准备硬编码的证书字符串

把你的目标SSL证书导出为PEM格式,将其转为C字符串(推荐用C11及以上支持的原始字符串字面量R"(...)",避免手动处理换行):

const std::string trusted_cert = R"(
-----BEGIN CERTIFICATE-----
// 替换为你的完整PEM格式证书内容
-----END CERTIFICATE-----
)";

步骤2:修改curlpp代码配置证书

更新原有代码,添加证书信任配置:

#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
#include <curlpp/Infos.hpp>
#include <iostream>

int main() {
    curlpp::Cleanup cleaner;
    curlpp::Easy request;

    // 硬编码的可信证书(PEM格式)
    const std::string trusted_cert = R"(
-----BEGIN CERTIFICATE-----
MIIDBTCCAe2gAwIBAgIUQ...(你的完整证书内容)
-----END CERTIFICATE-----
)";

    std::string requestUrl = "https://some.domain/";

    request.setOpt(new curlpp::options::Url(requestUrl));
    // 设置仅使用硬编码的证书作为可信CA
    request.setOpt(new curlpp::options::SslCaBlob(trusted_cert));
    // 强制验证服务器证书和主机名
    request.setOpt(new curlpp::options::SslVerifyPeer(true));
    request.setOpt(new curlpp::options::SslVerifyHost(2));
    // 禁用系统默认CA证书池,确保只信任指定证书
    request.setOpt(new curlpp::options::SslCAInfo(""));

    try {
        request.perform();
    } catch (const curlpp::RuntimeError& e) {
        std::cerr << "运行时错误: " << e.what() << std::endl;
    } catch (const curlpp::LogicError& e) {
        std::cerr << "逻辑错误: " << e.what() << std::endl;
    }

    return 0;
}

额外安全强化措施

  • 加密证书字符串:对硬编码的证书字符串进行XOR或AES加密,运行时动态解密后再传入curlpp,增加逆向提取证书的难度。
  • 代码混淆:对证书解密、curlpp配置相关代码块做混淆(控制流平坦化、指令替换等),提升逆向分析门槛。
  • 证书指纹双重验证:在建立连接后,额外验证服务器证书的SHA-256指纹,即使攻击者绕过CA信任也无法伪造匹配指纹的证书:
// 指定指纹算法为SHA256
request.setOpt(new curlpp::options::SslFingerprint("SHA256"));
// 获取服务器证书指纹
std::string server_fingerprint = curlpp::Infos::SslCertFingerprint().get(request);
// 预定义的可信指纹(替换为你的服务器证书SHA256指纹,冒号分隔)
const std::string trusted_fingerprint = "A1:B2:C3:...";

if (server_fingerprint != trusted_fingerprint) {
    std::cerr << "证书指纹不匹配,疑似中间人攻击!" << std::endl;
    return 1;
}

关键注意事项

  • 确保使用的curlpp依赖libcurl 7.71.0及以上版本,旧版本可能不支持SslCaBlob选项;
  • 必须禁用系统默认CA池,否则curlpp会同时信任系统CA和硬编码证书,无法达到仅信任指定证书的目的;
  • 证书过期时需重新编译发布应用,需提前规划证书更新流程。

内容的提问来源于stack exchange,提问作者caprisonne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:27:29