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添加证书校验事件,临时跳过校验:
- 选中窗体上的
TRESTClient组件,在事件面板找到OnValidateCertificate事件,双击生成处理函数 - 填入以下代码:
void __fastcall TForm1::RESTClient1ValidateCertificate(TObject *Sender, const TCertificate Certificate, bool &Accept) { // 测试环境直接信任所有证书,生产环境请补充证书指纹校验逻辑 Accept = true; }
额外注意事项
- 生产环境不要直接跳过证书校验,可将服务器根证书打包到应用Assets目录,在校验事件中比对证书公钥指纹,防范中间人攻击
- 确认AndroidManifest.xml中已声明
android.permission.INTERNET权限,权限缺失也可能引发同类网络异常 - 如果使用自签名证书,建议将证书内置到应用中完成校验,不要直接信任所有证书
内容的提问来源于stack exchange,提问作者Norm Strassner
相关产品推荐
相关产品推荐

