Delphi FMX TWebBrowser访问部分网站报TLS连接错误如何解决
问题原因
Windows平台下Delphi 11.1的FMX TWebBrowser 控件默认调用系统IE Trident内核,默认配置有两个硬伤:
- 不手动配置的话,进程不会自动启用TLS 1.1/1.2等现代安全协议,默认只开启老旧的SSL3.0、TLS1.0
- 默认以IE7兼容模式渲染页面,不支持现代Web的安全特性
剑桥词典已经禁用了旧版TLS协议和低版本IE的兼容逻辑,所以会弹出安全连接错误;谷歌搜索还保留了对旧协议、旧IE模式的兼容适配,所以能正常打开。
原生TWebBrowser修复方案(仅针对Windows平台)
在项目主窗体的OnCreate事件中添加如下初始化代码即可解决问题,其他平台(Android、iOS、macOS)的TWebBrowser默认调用系统原生WebKit内核,无此兼容问题,不需要额外配置。
首先在单元引用部分添加两个依赖单元:
uses Winapi.WinInet, System.Win.Registry;
然后添加初始化逻辑:
procedure TMainForm.FormCreate(Sender: TObject); const INTERNET_OPTION_SECURE_PROTOCOLS = 31; SECURITY_FLAG_TLS1 = 128; SECURITY_FLAG_TLS1_1 = 512; SECURITY_FLAG_TLS1_2 = 2048; var lProtocols: DWORD; Reg: TRegistry; ExeName: string; begin // 1. 为当前进程开启TLS1.0/1.1/1.2支持,关闭不安全的SSLv3 lProtocols := SECURITY_FLAG_TLS1 or SECURITY_FLAG_TLS1_1 or SECURITY_FLAG_TLS1_2; InternetSetOption(nil, INTERNET_OPTION_SECURE_PROTOCOLS, @lProtocols, SizeOf(lProtocols)); // 2. 配置IE控件渲染模式为IE11最新标准模式 ExeName := ExtractFileName(ParamStr(0)); Reg := TRegistry.Create(KEY_WRITE); try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION', True) then begin Reg.WriteInteger(ExeName, 11001); // 11001对应IE11边缘渲染模式,忽略站点兼容列表强制用最新标准 Reg.CloseKey; end; finally Reg.Free; end; end;
如果执行完上述代码仍然报错,打开系统Internet选项,切换到「高级」标签,在设置列表中确认已勾选「使用TLS 1.2」选项即可。
跨平台可用的替代浏览器组件
如果不想维护IE内核的兼容逻辑,可以选择以下适配多设备项目的浏览器组件:
- TEdgeBrowser:Delphi官方自带组件,Windows端基于微软Edge WebView2(Chromium内核),所有现代Web标准、新TLS协议都支持,兼容性比IE内核的TWebBrowser强很多。Win10 20H2之后的版本系统自带WebView2运行时,低版本Win10需要单独安装运行时,非Windows平台可以配合原生TWebBrowser做条件编译适配。
- 第三方Chromium封装组件:比如CEF4Delphi、WebView4Delphi,全平台统一使用Chromium内核,网页兼容性拉满,不会出现不同平台内核差异导致的渲染错位、功能异常问题,缺点是需要把Chromium内核打包进去,安装包体积会增加几十到上百兆。
- 轻量原生WebView封装组件:这类组件统一封装各个平台自带的浏览器内核——Android用系统WebView、iOS/macOS用WKWebView、Windows用WebView2,不额外嵌入浏览器内核,安装包体积很小,跨平台表现比原生TWebBrowser更统一,适合对包大小有要求的场景。
内容的提问来源于stack exchange,提问作者Haizhou
相关产品推荐
相关产品推荐

