不能将HTTPS与ServerXMLHTTP对象一起使用

Imr*_*aan 10 https soap certificate xmlhttprequest asp-classic

我支持通过HTTPS连接到支付网关的Classic ASP应用程序.直到最近,一直没有问题.几天前,服务器(Windows Server 2003)上安装了最新的更新,导致网站中断.下面是一段代码片段.

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
Run Code Online (Sandbox Code Playgroud)

下面是错误对象的转储: -

编号:-2147012852描述:完成客户端身份验证需要证书消息:需要证书才能完成客户端身份验证

起初我以为是因为支付网关的SSL证书没有经过身份验证,或者他们需要客户端证书.我在服务器上的浏览器中测试了URL,并且没有错误地正确显示,并确认Payment Gateway服务器不需要客户端证书.

我很茫然.我所做的所有研究都让我无处可去.我甚至尝试在Stackoverflow上找到以下内容: -

使XMLHTTP与HTTPS一起使用

xmlHttp,XML请求,asp

最后一个声明XMLHTTP需要客户端证书,即使服务器不需要它,并指向知识库文章如何安装,但这已经过时但不起作用.

Con*_*eak 7

尝试添加 oHttp.setOption 2, 13056


bam*_*bam 5

刚刚找到了通过测试的解决方案:

  • Windows 10 (IIS 10)
  • Windows 2012 R2 (IIS 8.5)

是客户端问题。正如 OP 所指出的那样,MSXML2.ServerXMLHTTP 确实要求您在调用使用 SSL 保护的端点时使用客户端证书(即使端点不需要它)。

在网络服务器上,您需要:

  1. 创建客户端证书
  2. 为证书分配权限
  3. 在 ServerXMLHTTP 对象上设置证书

详细:

1.创建客户端证书

使用以下 PowerShell 命令创建新的自签名证书:

New-SelfSignedCertificate -DnsName "ServerXMLHTTP", "ServerXMLHTTP" -CertStoreLocation "cert:\LocalMachine\My"
Run Code Online (Sandbox Code Playgroud)

请注意,此命令创建的证书的有效期仅为 1 年。

2.为证书分配权限

使用 MMC,查看计算机帐户的证书存储: 如何:使用 MMC 管理单元查看证书

上面创建的证书可以在Certificates (Local Computer)\Personal\Certificates 中找到(“颁发者”和“颁发给”列显示“ServerXMLHTTP”)。

右键单击 ServerXMLHTTP 证书,选择“所有任务”->“管理私钥”,将显示权限对话框。

添加运行 ASP 网站应用程序池的用户。默认情况下,它将作为“ApplicationPoolIdentity”运行,但您的设置可能正在使用特定的用户帐户。如果应用程序池使用 ApplicationPoolIdentity,则添加的用户名是“IIS AppPool\APP POOL NAME”,例如 IIS AppPool\DefaultAppPool

用户将被添加可以取消选择的“完全控制”。似乎只需要“读取”权限。单击“确定”以确认权限。

3.在ServerXMLHTTP对象上设置证书

在您的 ASP 代码中,将 ServerXMLHTTP 对象设置为使用上面创建的证书。例如调用 PayPal 获取访问令牌:

Dim strAuthToken: strAuthToken = "<Base64 encoded version of ClientId:Secret>"
Dim oHttp: Set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")

With oHttp
    Call .Open("POST", "https://api.sandbox.paypal.com/v1/oauth2/token", False)
    Call .SetOption(3, "LOCAL_MACHINE\My\ServerXMLHTTP")
    Call .SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    Call .SetRequestHeader("Authorization", "Basic " & strAuthToken)
    Call .Send("grant_type=client_credentials")
End With
Run Code Online (Sandbox Code Playgroud)

希望这仍然有帮助。


Ant*_*nes 0

这可能确实是 ServerFault.com 的问题,毕竟如果代码工作正常那么它不是一个编程问题。

不过我会尝试一些事情。首先尝试使用 ProgID“MSXML2.ServerXMLHTTP.3.0”,在某些情况下,MSXML3 的行为会有所不同,具体取决于使用哪个 ProgID 来实例化组件。另外,从其他来源(例如防病毒供应商)进行更新(Sophos 有此问题)可能会破坏 MSXML 安装。

安装 MSXML6 后,另一个要尝试的 ProgID 是“MSXML2.ServerXMLHTTP.6.0”。如果问题出在 MSXML3 核心更新上,那么 MSXML6 核心可能不会出现同样的问题。