Delphi使用Indy访问宝马服务开启TLS1.2/1.3仍返回403错误求助
问题根因
开启HttpAnalyzer时请求由工具的系统SSL栈代理完成,默认符合服务端的TLS安全校验规则;关闭工具后使用Indy自带的OpenSSL栈发起请求,配置不符合服务端要求被拦截返回403。
修复步骤
- 升级基础依赖
- 升级Indy组件到10.6.0+版本,确认是否支持TLS 1.3协议(对应枚举值
sslvTLSv1_3) - 替换配套的OpenSSL库到1.1.1+版本,匹配程序运行的32/64位架构
- 修改SSL配置
// 仅保留服务端支持的TLS版本,禁用老旧不安全的TLS1.0/1.1 lIOHandlerC.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3]; // 手动指定符合现代安全要求的加密套件列表,避免默认老旧套件被拦截 lIOHandlerC.SSLOptions.CipherList := 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; // 开启TLS SNI扩展,多域名HTTPS服务强制要求携带SNI才能完成握手 lIOHandlerC.Host := idHttpC.Request.Host;
- 修复参数编码问题
id_token和state为长字符串,存在特殊字符未正确编码的可能,手动对参数值做URL编码:
List.Add('id_token=' + TIdURI.ParamsEncode(JSON_GET_ID(res1, 3, 0))); List.Add('state=' + TIdURI.ParamsEncode(JSON_GET_ID(res1, 4, 0)));
- 调整Cookie配置
允许二级域名间传递Cookie,避免跨域鉴权时Cookie丢失:
idCookieC.AllowThirdPartyDroppedCookies := True;
内容的提问来源于stack exchange,提问作者Evgeny Levitskiy
相关产品推荐
相关产品推荐

