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

Fiddler代理下客户端证书配置失败返回401的解决问询

问题描述

使用Delphi的TIdHTTP组件发送带客户端证书的HTTPS请求,不通过Fiddler代理时一切正常,但启用Fiddler代理(127.0.0.1:8888)后,服务器返回401 Missing certificate or authorization header错误。

相关Delphi核心代码:

constructor TSpecialHTTP.Create(adbconn: IDBConnection; ...);
var
  ssl: TIdSSLIOHandlerSocketOpenSSL;
  dbresult: Variant;
  q: IDataset;
begin
  // 初始化HTTP客户端并设置Fiddler代理
  http := TIdHTTP.Create;
  http.ProxyParams.ProxyServer := '127.0.0.1';
  http.ProxyParams.ProxyPort := 8888;

  // 配置SSL handler
  ssl := TIdSSLIOHandlerSocketOpenSSL.Create(http);
  ssl.SSLOptions.SSLVersions := [sslvTLSv1_2];
  http.IOHandler := ssl;

  // 设置请求头(省略部分无关内容)
  http.Request.ContentType := 'application/json; charset=utf-8';
  http.Request.UserAgent := 'MyApplication';
  http.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + token;

  // 加载客户端证书
  certstream := TBytesStream.Create;
  if not VarIsNull(dbresult[1]) then begin
    SaveVariantToStream(certstream, dbresult[1]);
    certstream.Position := 0;
    certstream.SaveToFile(certfile);

    ssl.SSLOptions.CertFile := certfile;
    ssl.SSLOptions.KeyFile := certfile;
    ssl.SSLOptions.Mode := sslmBoth;
    ssl.OnGetPassword := GetPassword;
  end;
end;

已尝试在Fiddler脚本的OnBeforeRequest中添加配置:

oSession["https-Client-Certificate"] = "C:\\temp\\cert.pfx";

Fiddler捕获的请求中缺少证书相关的SSL握手信息,服务器返回401响应。


解决方案

1. 修正Fiddler脚本的证书配置

仅指定PFX路径不够,若证书有密码,需在路径后追加密码(用冒号分隔);同时建议针对目标域名配置,避免影响其他请求:

static function OnBeforeRequest(oSession: Session) {
    // 仅对目标API域名应用证书配置
    if (oSession.HostnameIs("api.example.com")) {
        // 格式:"PFX文件路径:证书密码"
        oSession["https-Client-Certificate"] = "C:\\temp\\cert.pfx:your_cert_password";
    }
}

2. 调整Delphi客户端的SSL配置

客户端现在是与Fiddler建立SSL连接,需确保Indy信任Fiddler的根证书:

  • 调试阶段可临时关闭证书验证(生产环境禁用):
    ssl.SSLOptions.VerifyMode := [];
    ssl.SSLOptions.VerifyDepth := 0;
    
  • 或把Fiddler的根证书导出(Fiddler菜单Tools > Options > HTTPS > Actions > Export Root Certificate to Desktop),导入到Indy的信任存储中。
  • 将SSL模式从sslmBoth改为sslmClient(客户端无需向Fiddler提供证书,除非Fiddler强制要求):
    ssl.SSLOptions.Mode := sslmClient;
    

3. 确保证书文件的有效性与权限

  • 确认Fiddler使用的PFX证书与Delphi代码中certfile指向的是同一个文件,避免用错证书。
  • 确保PFX文件所在目录(如C:\temp)对Fiddler进程有读取权限,不要放在系统受保护目录(如Program Files)。

4. 用Fiddler图形界面配置客户端证书(更可靠)

若脚本配置不生效,可直接通过Fiddler的图形界面设置:

  1. 打开Fiddler,点击Tools > Options > HTTPS。
  2. 点击Client Certificates按钮。
  3. 选择From PFX File,浏览选择你的PFX文件并输入密码。
  4. 可选择Use this certificate for all requests,或点击Add Rule针对api.example.com域名单独配置。
  5. 重启Fiddler使配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:45:04