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

Delphi 11.3 REST客户端基于客户端证书的身份认证实现问询

Delphi 11.3 REST客户端实现客户端证书认证(TLS 1.2+)

核心思路

Delphi自带的TRESTClient系列组件支持SSL/TLS客户端证书认证,优先使用你的.p12(PKCS#12)文件(包含证书+私钥),配合根证书.pem完成服务端信任验证,同时强制启用TLS 1.2及以上版本即可满足需求。

步骤与代码示例

1. 组件准备

在窗体或数据模块中添加以下组件:

  • TRESTClient:负责连接基础配置
  • TRESTRequest:处理请求(GET/PUT/PATCH可共用,切换Method即可)
  • TRESTResponse:接收服务端响应
  • TIdSSLIOHandlerSocketOpenSSL:SSL/TLS核心处理组件(Delphi 11.3默认集成,需确保OpenSSL库文件存在于程序运行目录)

2. 配置SSL与证书

在初始化代码中完成证书加载和TLS版本强制:

procedure TForm1.FormCreate(Sender: TObject);
var
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  // 初始化RESTClient基础配置
  RESTClient1.BaseURL := 'https://你的服务地址/api';
  RESTClient1.ContentType := 'application/json';

  // 配置SSL处理器
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    // 强制启用TLS 1.2及以上版本
    SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3];

    // 加载客户端PKCS#12证书(.p12文件)
    SSLHandler.SSLOptions.CertFile := '你的证书路径/client_cert.p12';
    SSLHandler.SSLOptions.CertPassword := '你的p12证书密码'; // 若证书无密码可省略

    // 加载根证书(.pem),用于验证服务端证书合法性
    SSLHandler.SSLOptions.RootCertFile := '你的证书路径/root_ca.pem';

    // 将SSL处理器绑定到RESTClient
    RESTClient1.IOHandler := SSLHandler;
  except
    SSLHandler.Free;
    raise;
  end;

  // 绑定Request与Response关联关系
  RESTRequest1.Client := RESTClient1;
  RESTRequest1.Response := RESTResponse1;
end;

3. 发送不同类型的请求

GET请求示例
procedure TForm1.SendGetRequest;
begin
  RESTRequest1.Method := rmGET;
  RESTRequest1.Resource := '/data/123'; // 接口资源路径
  RESTRequest1.Params.Clear;
  // 可选:添加URL参数
  RESTRequest1.Params.AddItem('param1', 'value1', pkGETorPOST);

  try
    RESTRequest1.Execute;
    // 处理响应内容
    Memo1.Lines.Add('GET响应状态: ' + IntToStr(RESTResponse1.StatusCode));
    Memo1.Lines.Add('响应内容: ' + RESTResponse1.Content);
  except
    on E: Exception do
      ShowMessage('GET请求失败: ' + E.Message);
  end;
end;
PUT请求示例(发送JSON数据)
procedure TForm1.SendPutRequest;
var
  RequestBody: string;
begin
  RESTRequest1.Method := rmPUT;
  RESTRequest1.Resource := '/data/123';
  RESTRequest1.Params.Clear;

  // 构造JSON请求体
  RequestBody := '{"name": "test", "value": "updated"}';
  RESTRequest1.AddBody(RequestBody, ctAPPLICATION_JSON);

  try
    RESTRequest1.Execute;
    Memo1.Lines.Add('PUT响应状态: ' + IntToStr(RESTResponse1.StatusCode));
    Memo1.Lines.Add('响应内容: ' + RESTResponse1.Content);
  except
    on E: Exception do
      ShowMessage('PUT请求失败: ' + E.Message);
  end;
end;
PATCH请求示例
procedure TForm1.SendPatchRequest;
var
  RequestBody: string;
begin
  RESTRequest1.Method := rmPATCH;
  RESTRequest1.Resource := '/data/123';
  RESTRequest1.Params.Clear;

  RequestBody := '{"value": "patched"}';
  RESTRequest1.AddBody(RequestBody, ctAPPLICATION_JSON);

  try
    RESTRequest1.Execute;
    Memo1.Lines.Add('PATCH响应状态: ' + IntToStr(RESTResponse1.StatusCode));
    Memo1.Lines.Add('响应内容: ' + RESTResponse1.Content);
  except
    on E: Exception do
      ShowMessage('PATCH请求失败: ' + E.Message);
  end;
end;

关键注意事项

  • OpenSSL库文件:确保程序目录下存在对应位数的OpenSSL库:32位程序用libeay32.dll、ssleay32.dll;64位程序用libcrypto-1_1-x64.dll、libssl-1_1-x64.dll,Delphi 11.3安装目录下通常自带这些文件。
  • 证书格式转换:如果.p12文件无法正常加载,可通过OpenSSL命令将.key和.pem证书合并为p12格式:
    openssl pkcs12 -export -in client_cert.pem -inkey client_key.key -out client_cert.p12
    
  • TLS版本适配:若服务端仅支持TLS 1.2,可将SSLVersions设为[sslvTLSv1_2]避免兼容性问题。
  • 错误排查:请求失败时,可捕获EIdSSLException等SSL相关异常,定位证书配置或TLS握手问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:55:05