为何Windows Server 2019及更早版本中带WINHTTP_FLAG_SECURE_DEFAULTS的WinHttpOpen调用失败?
Windows Server 2019及更早版本使用WINHTTP_FLAG_SECURE_DEFAULTS报错的原因及修复项
问题核心
调用代码:
WinHttpOpen(userAgent, WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC | WINHTTP_FLAG_SECURE_DEFAULTS);
在Windows Server 2019、2016等旧版本返回错误码87(ERROR_INVALID_PARAMETER),但Windows 10企业版、Server 2022可正常运行。移除WINHTTP_FLAG_SECURE_DEFAULTS标志后问题消失,说明旧版本系统对该安全标志的支持存在缺失,且该问题与SChannel本身的TLS 1.2支持无关。
常见缺失的配置、功能或补丁
1. 未安装必要的累积更新补丁
WINHTTP_FLAG_SECURE_DEFAULTS是较新引入的标志,旧版本WinHTTP组件未支持该参数:
- Windows Server 2019:需安装2020年5月及之后的累积更新(如KB4556799),这类补丁更新了WinHTTP组件,使其能正确识别该安全标志。
- Windows Server 2016:需安装2021年1月及之后的累积更新(如KB4598293),此版本之后的WinHTTP才完成对该标志的适配。
2. WinHTTP协议配置缺失
即使SChannel支持TLS 1.2,WinHTTP可能未默认启用对应协议,需手动配置注册表:
- 定位到注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp- 添加DWORD类型值
DefaultSecureProtocols,设置为0x00000A00(仅启用TLS 1.2)或0x00000C00(启用TLS 1.2+TLS 1.3)
- 添加DWORD类型值
- 若为64位系统,需同步配置
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp下的相同键值
3. 系统默认协议未配置TLS 1.2
若未将TLS 1.2设为系统默认客户端协议,WinHTTP的安全标志可能无法正常生效:
- 定位到注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client- 设置
Enabled为0x00000001 - 设置
DisabledByDefault为0x00000000
- 设置
验证步骤
- 安装对应累积更新后重启系统,重新测试
WinHttpOpen调用 - 配置注册表后重启系统(或WinHTTP相关服务),验证参数有效性
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

