【问题标题】:Can't use HTTPS with ServerXMLHTTP object不能将 HTTPS 与 ServerXMLHTTP 对象一起使用
【发布时间】:2012-03-02 01:10:31
【问题描述】:

我支持通过 HTTPS 连接到支付网关的经典 ASP 应用程序。直到最近都没有问题。几天前,最新的更新安装在服务器 (Windows Server 2003) 上,导致网站崩溃。下面是一个代码 sn-p。

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 上找到的以下内容:-

Getting XMLHTTP to work with HTTPS

xmlHttp, XML request,asp

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

【问题讨论】:

  • 我猜网关的 SSL 证书现在是由不在您服务器受信任的根权限列表中的人提供的,您需要像 curl 的 CURLOPT_SSL_VERIFYPEER 这样的参数。如果有什么我会回来的。
  • 你列出的第一个问题的答案是我一直在寻找的,应该对你有用。
  • 我是帮助解决这个问题的系统管理员。第一个问题的答案并不能解决我担心的问题。实际上,该选项已在上述问题中发布的代码中设置。除此之外,这至少发生在 3 个独立的服务器上,最近没有一个服务器看到任何配置更改,除非在问题开始发生后昨天/今天安装的 Windows 更新。在那之前的最后一次更新是在 11 月下旬。
  • 使用纯 HTTP 有效,这证明代码是正确的。服务器上的某些东西正在阻止 XMLHTTP 使用 HTTPS 访问任何 URL。

标签: soap asp-classic https certificate xmlhttprequest


【解决方案1】:

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

  • 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"

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

2。为证书分配权限

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

上面创建的证书可以在 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

希望这仍然有帮助。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 刚刚注意到 .setOption 2 有所帮助。那没有被标记为答案并错过了它。在这种情况下,您可以安装支付网关证书的中间证书和根证书(如果它们缺少任何链)。那可以避免使用 SetOption 2
    【解决方案3】:

    您可以尝试使用 oHttp.setOption(3) = "证书存储名称/证书的友好名称" 如下。我希望这会奏效。

    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
    

    【讨论】:

    • 选项 3 是 SXH_OPTION_SELECT_CLIENT_SSL_CERT。据我所知,这是指定客户端证书,当海报说没有使用客户端证书时。为什么您认为添加它会有所帮助?
    【解决方案4】:

    尝试添加oHttp.setOption 2, 13056

    【讨论】:

    • 试过那个语法但还是不行
    • 我们有一个使用 MSXML 的旧版 ASP 应用程序,该应用程序刚刚传输到不同的 ISP,并在尝试通过 HTTPS 连接时开始收到Error -2147012851: The certificate authority is invalid or incorrect。 (通过 HTTP 连接工作得很好。)将这个 .setOption 2, 13056 添加到我们的代码中已经“解决”(避免)了这个问题,所以谢谢 Zee Tee!
    【解决方案5】:

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

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

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

    【讨论】:

    • 我试过使用3.0、4.0和6.0版本,都报同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2012-05-21
    相关资源
    最近更新 更多