Windows 11更新后Delphi XE8 Indy OpenSSL出现SSL握手失败错误求助
问题描述
项目在Windows 10上可正常运行,此前Windows 11环境下也能正常工作,但安装非22H2版本的Windows 11更新后,触发以下SSL握手错误:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure.
环境配置信息:
- Indy 10.6.2.5263
- OpenSSL 1.0.2u
- Delphi XE8
相关初始化代码:
CInitialized := false; idHttpC := TIdHTTP.Create(nil); idHttpC.ConnectTimeout := 80000; idHttpC.ReadTimeout := 80000; idHttpC.AllowCookies := true; // config Redirect's idHttpC.RedirectMaximum := 35; idHttpC.HandleRedirects := true; idHttpC.HTTPOptions := [hoTreat302Like303, hoKeepOrigProtocol]; idHttpC.OnRedirect := IdHTTP1Redirect; // create Cookie's idCookieC := TIdCookieManager.Create(IdHttpC); idHttpC.CookieManager := idCookieC; // create gzip Compressor idHttpC.Compressor := TIdCompressorZLib.Create(idHttpC); // create OpenSSL lIOHandlerC := TIdSSLIOHandlerSocketOpenSSL.Create(nil); lIOHandlerC.SSLOptions.Mode := sslmClient; lIOHandlerC.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; idHttpC.IOHandler := lIOHandlerC;
执行以下请求代码时触发错误:
Result := idHttpC.Get('https://leinestern.de/');
已禁用系统内置杀毒软件和防火墙,无第三方安全工具,询问问题原因及调整方案。
问题分析与解决方案
核心原因
- OpenSSL版本过旧:OpenSSL 1.0.2u在2020年12月已停止所有安全维护,Windows 11的更新可能调整了系统底层SSL/TLS行为,淘汰了旧版本支持的弱加密套件或协议逻辑;同时目标网站
leinestern.de的服务器SSL配置大概率已升级,不再兼容1.0.2u的加密能力。 - Indy与OpenSSL的兼容性缺口:你使用的Indy 10.6.2.5263虽支持TLS 1.2,但和停止维护的OpenSSL 1.0.2u组合,在新系统环境下的握手流程容易出现不匹配。
调整方案
升级OpenSSL版本
更换为仍有安全支持的OpenSSL 1.1.1系列(如最新稳定版1.1.1w),注意对应项目的32/64位架构,替换旧的libeay32.dll和ssleay32.dll为1.1.1版本的libcrypto-1_1.dll、libssl-1_1.dll。若尝试OpenSSL 3.x,需确认Indy 10.6.x的兼容性。优化SSL协议与加密套件配置
- 移除已被主流服务器淘汰的TLS 1.0/1.1,仅保留TLS 1.2:
lIOHandlerC.SSLOptions.SSLVersions := [sslvTLSv1_2]; - 强制指定现代服务器普遍兼容的加密套件:
lIOHandlerC.SSLOptions.CipherList := 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
- 移除已被主流服务器淘汰的TLS 1.0/1.1,仅保留TLS 1.2:
升级Indy组件
将Indy更新至最新的10.6.x稳定版,新版本修复了大量SSL/TLS兼容性问题,能更好适配新系统环境及新版OpenSSL。验证系统SSL配置
检查注册表路径HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client下的Enabled值是否为0x1,确保系统层面未限制TLS 1.2的使用。
内容的提问来源于stack exchange,提问作者Evgeny Levitskiy
相关产品推荐
相关产品推荐

