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

时间:2012-02-09 14:48:09

标签: soap asp-classic https certificate xmlhttprequest

我支持通过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

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

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

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

我不知所措。我所做的所有研究都让我无处可去。我甚至在Stackoverflow上尝试了以下内容: -

Getting XMLHTTP to work with HTTPS

xmlHttp, XML request,asp

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

5 个答案:

答案 0 :(得分:6)

尝试添加oHttp.setOption 2, 13056

答案 1 :(得分:3)

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

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

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

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

  1. 创建客户端证书
  2. 为证书分配权限
  3. 在ServerXMLHTTP对象上设置证书
  4. 详细说明:

    <强> 1。创建客户端证书

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

    New-SelfSignedCertificate -DnsName "ServerXMLHTTP", "ServerXMLHTTP" -CertStoreLocation "cert:\LocalMachine\My"
    

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

    <强> 2。为证书分配权限

    使用MMC,查看计算机帐户的证书存储区: How to: View Certificates with the MMC Snap-in

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

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

    添加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
    

    希望这仍有帮助。

答案 2 :(得分:0)

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

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

安装MSXML6后,另一个尝试的ProgID是“MSXML2.ServerXMLHTTP.6.0”。如果问题是对MSXML3内核的更新,那么MSXML6内核可能没有同样的问题。

答案 3 :(得分:0)

你可以试试oHttp.setOption(3)=&#34;证书商店名称/证书的友好名称&#34; 如下。我希望这会奏效。

Dim oHttp                    
Dim strResult 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
oHttp.setOption(2) = 13056
oHttp.setOption(3) = "certificate store name/friendlyname of certificate"
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

答案 4 :(得分:0)

我知道这是一个老问题。此问题可能是因为不受支持的密码套件。 尝试添加 - TLS_RSA_WITH_AES_128_CBC_SHA AES128-SHA - TLS_RSA_WITH_AES_256_CBC_SHA AES256-SHA

这意味着你必须遵循这个kb:http://support.microsoft.com/kb/948963 如果您仍在使用Windows 2003,此更新也很有趣。这将允许使用SHA2连接到站点 - http://support.microsoft.com/kb/968730

请注意,Windows Server 2003支持将于2015年7月14日结束