XMLHTTP请求https与WinHTTP.WinHTTPRequest.5.1区别_对象选择
Microsoft.XMLHTTP是ASP和VBScript中常用的HTTP请求对象,用于在服务端发起HTTP请求获取远程页面内容、调用API接口、提交数据等。但在请求HTTPS地址时,XMLHTTP对象经常出现各种错误——证书验证失败、安全协议不支持、握手失败、超时、返回空白等。这些问题的根源在于XMLHTTP对象依赖Windows系统的SSL/TLS栈和证书存储,旧系统(如Windows Server 2008)默认不支持TLS1.2,证书验证严格,导致很多HTTPS请求失败。本文整理XMLHTTP请求HTTPS时的常见错误、原因分析和解决方法,帮助ASP开发者解决HTTPS请求问题。
用ServerXMLHTTP忽略证书错误的完整代码示例:<% On Error Resume Next Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0") If Err.Number <> 0 Then Set http = CreateObject("MSXML2.ServerXMLHTTP.3.0") End If On Error GoTo 0 ' 忽略所有证书错误 http.setOption 2, 13056 ' 设置超时 http.setTimeouts 15000, 15000, 30000, 30000 http.open "GET", "https://目标地址", False http.send If http.status = 200 Then Response.Write http.responseText Else Response.Write "请求失败,状态码:" & http.status End If Set http = Nothing %>。13056是忽略未知CA、证书过期、CN不匹配、用法错误的组合值,适合测试环境,生产环境建议正确安装证书而不是忽略。
WinHTTP.WinHTTPRequest.5.1是另一个推荐的服务端HTTP请求对象,比ServerXMLHTTP更轻量,HTTPS支持更好,是微软新一代的HTTP客户端。创建对象:Set http = CreateObject("WinHTTP.WinHTTPRequest.5.1")。用法:http.open "GET", "https://目标地址", False http.send。WinHTTP支持setOption方法忽略证书错误:Const WINHTTP_OPTION_SECURITY_FLAGS = 4 Const SECURITY_FLAG_IGNORE_UNKNOWN_CA = &H100 Const SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = &H2000 Const SECURITY_FLAG_IGNORE_CERT_CN_INVALID = &H1000 Const SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE = &H2000000 http.setOption WINHTTP_OPTION_SECURITY_FLAGS, SECURITY_FLAG_IGNORE_UNKNOWN_CA Or SECURITY_FLAG_IGNORE_CERT_DATE_INVALID Or SECURITY_FLAG_IGNORE_CERT_CN_INVALID。WinHTTP在Windows Server 2008及以上系统自带。
证书问题的根本解决方法是正确安装证书,而不是忽略验证。如果目标网站使用的是公共CA(如Let's Encrypt、DigiCert、Sectigo)签发的证书,Windows服务器的根证书存储区通常已有这些CA,Windows Update会自动更新根证书列表。如果服务器长期没有更新,根证书列表可能过期,需要运行Windows Update更新根证书,或手动下载目标网站的根证书安装到「受信任的根证书颁发机构」。安装方法:在服务器上用IE访问目标HTTPS网站,点击地址栏的锁图标,查看证书,证书路径中找到根证书,导出为CER文件,双击运行,选择「安装证书」-「本地计算机」-「受信任的根证书颁发机构」,完成安装。
Windows Server 2012及以上系统默认支持TLS1.2,不需要额外安装补丁,但需要确认.NET Framework版本。ASP程序如果通过.NET调用XMLHTTP,.NET 4.5以下默认不使用TLS1.2,需要在代码中设置ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12,或安装.NET 4.7以上版本(默认使用系统协议)。.NET 4.0可以通过注册表启用强加密:在HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkv4.0.30319下创建DWORD值SchUseStrongCrypto=1,64位系统在Wow6432Node路径下也设置。设置后重启IIS。
XMLHTTP请求HTTPS返回空白或乱码的处理。返回空白可能是因为响应内容是gzip压缩的,XMLHTTP不会自动解压。解决方法:在请求头中设置Accept-Encoding: identity,告诉服务器不要压缩:http.setRequestHeader "Accept-Encoding", "identity"。或者用ServerXMLHTTP的responseBody属性获取原始字节,再用ADODB.Stream解压。返回乱码是因为响应编码和页面编码不一致,用responseText获取时XMLHTTP用默认编码解析。解决方法:用responseBody获取字节,再用ADODB.Stream指定编码转换:Set stream = CreateObject("ADODB.Stream") stream.Type = 1 stream.Open stream.Write http.responseBody stream.Position = 0 stream.Type = 2 stream.Charset = "UTF-8" Response.Write stream.ReadText。
XMLHTTP请求HTTPS POST数据的注意事项。POST请求需要设置Content-Type请求头,表单数据用application/x-www-form-urlencoded,JSON数据用application/json。代码示例:http.open "POST", "https://目标地址", False http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" http.send "name=value&name2=value2"。HTTPS下POST和GET的区别只在请求方法和数据,证书和协议配置相同。如果POST数据包含中文,需要URL编码:Server.URLEncode("中文"),或在Content-Type中指定charset:http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"。
运维评价:「XMLHTTP在服务端用问题多,一直推荐客户用ServerXMLHTTP或WinHTTP,这两个对象HTTPS支持好,配置选项多,资源管理也可靠。迁移代码改动很小,创建对象那行改一下就行」「Win2008系统的TLS1.2配置是高频问题,很多老ASP程序跑在Win2008上,目标网站升级TLS1.2后就请求失败,打补丁改注册表能解决,但根本方案还是升级服务器系统」。
经验总结:XMLHTTP HTTPS问题的解决优先级:1.替换为ServerXMLHTTP 6.0或WinHTTP对象;2.设置忽略证书错误(测试用);3.Win2008系统启用TLS1.2(打补丁+注册表);4.检查代理和防火墙;5.正确安装根证书(生产环境)。新代码直接用WinHTTP.WinHTTPRequest.5.1,不要用旧的Microsoft.XMLHTTP。旧系统升级到Windows Server 2016/2019是根本解决方案,默认支持TLS1.2和TLS1.3,不需要额外配置。

更新时间:2026-08-26 22:26:32
上一篇:搜索结果页打不开错误怎么处理