VB6.0调用ServerXMLHTTP请求HTTPS接口在Win7报安全通道错误
错误原因
错误码-2147012739 (80072f7d)对应HTTPS握手阶段安全通道协商失败,核心原因是Windows 7和Windows 10的默认安全协议支持存在差异:
- Windows 10默认启用TLS 1.1、TLS 1.2作为HTTPS握手的可选协议,符合当前绝大多数线上HTTPS接口的安全要求
- Windows 7默认仅启用TLS 1.0,而现在公网的HTTPS接口几乎都已停止对TLS 1.0的支持,就会导致握手失败
排查&解决方法
1. 系统层面配置(优先操作,适配所有程序)
- 先确认Windows 7已经升级到SP1版本,TLS 1.1/1.2的官方补丁仅支持SP1环境
- 安装微软官方补丁KB3140245,给Windows 7添加TLS 1.1/1.2的系统级支持
- 修改注册表启用TLS 1.2作为默认安全协议:
找到路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client,新建两个DWORD值:DisabledByDefault设为0,Enabled设为1 - 配置WinHTTP默认使用TLS 1.2:
找到路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp,新建DWORD值DefaultSecureProtocols设为0x00000A80(同时启用TLS1.1和TLS1.2);如果是32位程序运行在64位Windows 7上,还要在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp路径下添加相同的键值
2. 代码层面适配(无需修改系统配置,仅对当前程序生效)
如果不想修改用户系统配置,可以直接在代码里指定安全协议版本,修改后的代码如下:
Public Sub GetAPIToken(aUserName As String, aPassword As String, aResponse As String) Dim WinHttpReq As Object Dim strURL As String, strJSON As String ' 指定使用6.0版本的MSXML2,避免低版本不支持TLS配置 Set WinHttpReq = CreateObject("MSXML2.ServerXMLHTTP.6.0") strURL = "https://example.com/v1/users/login" strJSON = "{" _ & Chr(34) & "username" & Chr(34) & ":" & Chr(34) & aUserName & Chr(34) & "," _ & Chr(34) & "password" & Chr(34) & ":" & Chr(34) & aPassword & Chr(34) _ & "}" With WinHttpReq .Open "POST", strURL, False .setRequestHeader "Content-Type", "application/json" ' 新增以下代码,强制启用TLS1.2,值3840对应同时启用TLS1.1+TLS1.2,可按需调整 .setOption 9, 3072 .Send strJSON aResponse = .responseText End With Set WinHttpReq = Nothing End Sub
3. 其他排查项
- 确认目标站点的SSL证书是否被Windows 7系统的根证书列表信任,是否存在根证书缺失的问题
- 确认设备上的杀毒、防火墙类软件没有拦截HTTPS握手请求
内容的提问来源于stack exchange,提问作者Prashant Bahire
相关产品推荐
相关产品推荐

