Soap Can';不要将HTTPS与ServerXMLHTTP对象一起使用

Soap Can';不要将HTTPS与ServerXMLHTTP对象一起使用,soap,asp-classic,https,certificate,xmlhttprequest,Soap,Asp Classic,Https,Certificate,Xmlhttprequest,我支持通过HTTPS连接到支付网关的经典ASP应用程序。直到最近,还没有出现任何问题。几天前,服务器(Windows server 2003)上安装了最新的更新,导致网站崩溃。下面是一段代码片段 Dim oHttp Dim strResult Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") oHttp.setOption(2) = 13056 oHttp.open "POST", SOAP_ENDPOINT, false oHttp.setReq

我支持通过HTTPS连接到支付网关的经典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,它显示正确,没有错误,并确认支付网关服务器不需要客户端证书

我不知所措。我所做的所有研究都毫无结果。我甚至在Stackoverflow上尝试了以下内容:-


最后一篇文章指出,即使服务器不需要客户端证书,XMLHTTP也需要客户端证书,并指出了一篇关于如何安装客户端证书的KB文章,但这篇文章已经过时并且不起作用。

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

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


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

尝试添加
oHttp.setOption 213056
您可以尝试使用oHttp.setOption(3)=“证书存储名称/证书的friendlyname” 如下。我希望这能奏效

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

我知道这是个老问题。此问题可能是因为不支持的密码套件。 尝试添加 -TLS_RSA_与_AES_128_CBC_SHA AES 128-SHA -TLS_RSA_带AES_256_CBC_SHA AES 256-SHA

这意味着您必须遵循以下知识库: 如果您仍在使用windows 2003,此更新也很有趣。这将允许使用SHA2连接到现场-


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

刚刚找到解决方案,并通过了以下测试:

  • Windows 10(IIS 10)
  • Windows 2012 R2(IIS 8.5)
这是客户的问题。正如OP所指出的,MSXML2.ServerXMLHTTP确实要求您在调用受SSL保护的端点时使用客户端证书(即使端点不需要它)

在Web服务器上,您需要:

  • 创建客户端证书
  • 为证书分配权限
  • 在ServerXMLHTTP对象上设置证书
  • 详细内容:

    1。创建客户端证书

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

    New-SelfSignedCertificate -DnsName "ServerXMLHTTP", "ServerXMLHTTP" -CertStoreLocation "cert:\LocalMachine\My"
    
    请注意,此命令创建的证书的有效期仅为1年

    2。为证书分配权限

    使用MMC,查看计算机帐户的证书存储:

    上面创建的证书可以在证书(本地计算机)\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
    
    Dim strAuthToken:strAuthToken=“”
    Dim oHttp:Set oHttp=Server.CreateObject(“MSXML2.ServerXMLHTTP”)
    与oHttp
    Call.Open(“POST”https://api.sandbox.paypal.com/v1/oauth2/token“,错)
    Call.SetOption(3,“本地\u机器\My\ServerXMLHTTP”)
    Call.SetRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”)
    Call.SetRequestHeader(“授权”、“基本”和strAuthToken)
    Call.Send(“授权类型=客户端凭据”)
    以
    

    希望这仍然有帮助。

    我猜网关的SSL证书现在由不在服务器的受信任根权限列表中的人提供,您需要一个参数,如curl的
    CURLOPT\u SSL\u VERIFYPEER
    。如果我发现了什么,我会回来的。你列出的第一个问题的答案是我在寻找什么,应该为你工作。我是系统管理员,正在帮助你。恐怕第一个问题的答案不能解决问题。事实上,上述问题中发布的代码中已经设置了该选项。除此之外,这至少发生在3台独立的服务器上,其中没有一台最近看到任何配置更改,除非在问题开始发生后昨天/今天安装了Windows更新。在此之前的最后一次更新是在11月下旬。使用普通HTTP有效,这证明代码是可靠的。服务器上的某些内容正在阻止XMLHTTP使用HTTPS访问任何URL。我已尝试使用版本3.0、4.0和6.0,所有这些版本都会出现相同的错误。尝试了该语法,但仍然无效