我支持一个通过 HTTPS 连接到支付网关的 Classic ASP 应用程序。直到最近都没有出现问题。几天前,在没有代码、IIS 配置或任何本地更改的情况下,它坏了。它在至少 3 个独立的服务器上坏了。最后一次运行 Windows 更新是在 11 月下旬,但更新服务器的更新并没有解决问题。下面是代码片段。
Dim oHttp
Dim strResult
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
oHttp.setOption 2, 13056
oHttp.open "POST", SOAP_ENDPOINT, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION
oHttp.send SOAP_REQUEST
以下是错误对象的转储:-
Number: -2147012852
Description: A certificate is required to complete client authentication
Message: A certificate is required to complete client authentication
我最初在 Stackoverflow 上发布了这个问题(https://stackoverflow.com/questions/9212985/cant-use-https-with-serverxmlhttp-object) 认为这是一个代码问题,但进一步调查似乎指向服务器问题。
答案1
这确实是一个长远的打算,但由于您没有说明服务器上安装的 MSXML 版本,因此如下所示:
- 打开本地计算机存储的证书 MMC
- 导航至个人 -> 证书
- 注意最近可能已过期的任何证书
如果任何证书最近过期,这可能会导致该问题。
问题是由于 SSL 在 3.0 版 MSXML 解析器 (msxml2.lib) 中实现不佳,ServerXMLHTTP 对象期望任何 SSL 连接都要求服务器和客户端证书身份验证,即使请求的服务器不需要客户端证书身份验证。
如果 xml 解析器无法提供有效的客户端证书(例如由于过期而无效),它就会抛出错误。
这是一个非常古老的错误(已于 2005 年 11 月在 MSXML 3.0 SP2 中修复),这篇 kb 文章描述了一种解决方法:http://support.microsoft.com/kb/302080