Iis 安全通道支持-经典ASP HTTP请求中出错

Iis 安全通道支持-经典ASP HTTP请求中出错,iis,asp-classic,xmlhttprequest,windows-server-2012,Iis,Asp Classic,Xmlhttprequest,Windows Server 2012,我有一个经典的ASP网站运行在Windows Server 2012上。一个页面使用如下代码通过https向另一个应用程序发出HTTP请求: 子商店xml4http(url、inStr、outtr、method、xmlerror) 模糊对象 设置objhttp=Server.CreateObject(“MSXML2.ServerXMLHTTP.6.0”) objHttp.open方法,url,false 如果Method=“POST”,则 发送指令 其他的 发送 如果结束 outtr=objHt

我有一个经典的ASP网站运行在Windows Server 2012上。一个页面使用如下代码通过https向另一个应用程序发出HTTP请求:

子商店xml4http(url、inStr、outtr、method、xmlerror)
模糊对象
设置objhttp=Server.CreateObject(“MSXML2.ServerXMLHTTP.6.0”)
objHttp.open方法,url,false
如果Method=“POST”,则
发送指令
其他的
发送
如果结束
outtr=objHttp.responseText
设置objhttp=nothing
端接头
这段代码几乎在所有时间都能正常工作(每天有数千个请求),但偶尔会出现如下消息:

电话号码:-2147012739

描述:安全通道支持中发生错误

来源:msxml6.dll


应用程序最近从旧的Windows 2003服务器移动到了2012服务器,而这个问题在旧服务器上似乎从来都不是问题。此外,当这个错误发生在网站上时,我可以在VBScript中运行完全相同的代码,并且工作正常。重置应用程序池似乎会使站点能够再次执行安全HTTP请求(尽管它通常会在我到达服务器之前自行修复)。

错误代码疑难解答:

  • -2147012739是一个HRESULT
  • 十六进制是0x80072F7D
  • 看看LOWORD:0x2F7D
  • 将其转换回十进制:12157
  • 查找12157错误代码
  • 发现它匹配:错误\u WINHTTP\u安全\u通道\u错误
  • Google fu发现了以下内容:

    错误\u WINHTTP\u安全\u通道\u错误

    12157

    指示发生与安全通道有关的错误(相当于以“winerror.h”头文件中列出的“SEC_E_”和“SEC_I_”开头的错误代码)

    但是,您已经发现了这一点,因为您收到的消息是“描述:安全通道支持中发生错误”。这让我们回到了起点

    我所做的另一个观察是,您的代码是一个非异步WinHTTP请求(我知道它必须在ASP中运行),但是,问题是,由于频率很高,您的机器可能同时处理多个WinHTTP请求。我看到一些Windows故意通过阻止延迟请求来限制活动并发WinHTTP请求的总数。例如,在Windows 7计算机上,进程对同一远程服务器的并发请求不能超过2个。i、 第三,第四。。。请求将被阻止,直到前两个请求完成


    一种解决方案是通过多个应用程序池或多个服务器对传入请求进行负载平衡。

    我几个月前遇到了这个错误。大多数情况下,此问题是由无效的SSL证书引起的。考虑到发布时您刚刚迁移到新服务器,您可能只需要重新安装SSL证书


    我知道这个问题很老了,但希望其他人能从我的回答中受益

    从2003年迁移到2008年R2后,我遇到了完全相同的问题,并找到了解决方案。更改:

    Set objhttp=Server.CreateObject(“MSXML2.ServerXMLHTTP.6.0”)

    致:

    Set objhttp=Server.CreateObject(“MSXML2.XMLHTTP.6.0”)

    你的问题就会消失


    我试图找出这两个对象的优缺点,但还没有找到不使用XMLHTTP的理由。

    我也遇到过同样的问题,并尝试了各种帖子提供的许多解决方案,但最终没有成功,直到现在。我将详细说明解决方案,为我工作的参考问题,在我的情况下,它是贝宝。我还没有打开一个新的职位,因为这可能不仅仅是一个贝宝在未来的问题

    该解决方案是针对类似问题发布的许多stackoverflow解决方案的组合,但这似乎是最好的添加方案

    问题 尝试使用PayPal沙盒在Windows Server 2008上使用经典ASP测试PayPal IPN时返回错误“安全通道支持中发生错误”

    为什么这是一个问题 贝宝要求所有与其系统的通信尽可能安全。您将需要TLS 1.2的连接。默认情况下,Windows Server 2008不是TLS 1.2

    PayPal说您需要一个Verisign G5证书,这是对服务器根目录而不是运行代码的域所做的,这给混合带来了一些混乱。我也没有安装任何PayPal证书,因为我没有使用API。我相信你也不需要HTTPS站点的通信——尽管我的域使用标准的GoDaddy EV证书进行了安全保护,尽管之后我在一个非HTTPS站点上做了一个测试,这也起到了作用

    我的解决方案
  • 首先,通过检查服务器使用的是哪种安全性。 它应该是TLS1.2或更高版本,而不是其他TLS或SSL。它还必须具有SHA256加密。 您可能需要修补服务器:

  • 使用IISCrypto设置正确的TLS和密码。我使用了stackoverflow上其他地方提供的注册表更改,但这不起作用,事实上,使用HTTPS帖子,而不仅仅是我的开发站点,完全破坏了我的服务器!IISCrypto还处理密码

  • 确保您的应用程序池是v4.5,这本身并不清楚,因为IIS可能只提供v4.0作为选项。然而,这可能实际上是v4.5。您可以通过以下方式进行验证

  • 在代码中,您需要使用
    Server.CreateObject(“MSXML2.XMLHTTP.6.0”)
    ,而不是上面提到的
    Server.CreateObject(“MSXML2.ServerXMLHTTP.6.0”)

  • 现在我不知道为什么非服务器XMLHTTP可以工作,因为这似乎与它背后的文档相反。现在,在经历了10天的压力、恐慌和挫折之后,我不在乎!我希望这对其他人有用

    发现
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
    "DefaultSecureProtocols"=dword:00000800
    
    <%
    Set winhttp = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1")
    winhttp.open "GET", "https://howsmyssl.com/a/check", False
    winhttp.Send
    Response.Write winhttp.responseText 
    %>
    
    DefaultSecureProtocols Value         Protocol enabled
    0x00000008                           Enable SSL 2.0 by default
    0x00000020                           Enable SSL 3.0 by default
    0x00000080                           Enable TLS 1.0 by default
    0x00000200                           Enable TLS 1.1 by default
    0x00000800                           Enable TLS 1.2 by default