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

C++Builder安卓端REST请求第二次执行提示服务器证书无效如何解决?

问题解决方法

根因说明

C++Builder 封装的 REST 组件在 Android 平台下 SSL 会话缓存存在复用逻辑缺陷,首次请求完成后残留的会话状态没有被正确清理,导致第二次发起请求时证书校验链路读取了失效的缓存数据,抛出证书无效异常;Windows 平台的 SSL 底层实现会自动处理会话重置,因此没有该问题。

解决方案

方案1:每次请求前重置组件状态(推荐,不影响安全性)

直接修改点击事件代码,每次发起请求前主动清空残留数据、重置RESTClient的SSL上下文即可:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 清空请求、响应的历史残留数据
    RESTRequest1->Clear();
    RESTResponse1->Clear();
    // 重置RESTClient的SSL会话缓存,解决Android平台二次请求证书错误问题
    RESTClient1->Reset();

    RESTRequest1->Resource = "";
    RESTRequest1->Method = TRESTRequestMethod::rmPOST;
    RESTRequest1->Response = RESTResponse1;
    RESTRequest1->Response->ContentType = "application/json";
    RESTRequest1->Response->ContentEncoding="UTF-8";
    RESTRequest1->Execute();
    
    Memo1->Lines->Add(RESTResponse1->Content);
}

方案2:添加证书校验兜底逻辑(仅测试环境使用,生产需调整)

如果方案1执行后仍有报错,可以给TRESTClient添加证书校验事件,临时跳过校验:

  1. 选中窗体上的TRESTClient组件,在事件面板找到OnValidateCertificate事件,双击生成处理函数
  2. 填入以下代码:
void __fastcall TForm1::RESTClient1ValidateCertificate(TObject *Sender,
          const TCertificate Certificate, bool &Accept)
{
    // 测试环境直接信任所有证书,生产环境请补充证书指纹校验逻辑
    Accept = true;
}

额外注意事项

  • 生产环境不要直接跳过证书校验,可将服务器根证书打包到应用Assets目录,在校验事件中比对证书公钥指纹,防范中间人攻击
  • 确认AndroidManifest.xml中已声明android.permission.INTERNET权限,权限缺失也可能引发同类网络异常
  • 如果使用自签名证书,建议将证书内置到应用中完成校验,不要直接信任所有证书

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:00