Mik*_*e S 30 iis xmlhttprequest asp-classic windows-server-2012
我有一个在Windows Server 2012上运行的经典ASP网站.一个页面使用以下代码通过https向另一个应用程序发出HTTP请求:
Sub ShopXML4http(url, inStr, outStr, method, xmlerror)
Dim objhttp
Set objhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")
objHttp.open method, url, false
If Method="POST" Then
objHttp.Send instr
Else
objHttp.Send
End if
outstr=objHttp.responseText
Set objhttp=nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
这段代码几乎在所有时间都可以正常工作(每天数千个请求),但偶尔会出现这样的消息:
编号:-2147012739
说明:安全通道支持发生错误
来源:msxml6.dll
该应用程序最近从旧的Windows 2003 Server迁移到2012 Server,这个问题在旧服务器上似乎永远不会出现问题.此外,虽然这个错误发生在网站上,我可以在VBScript中运行完全相同的代码,它工作正常.重置应用程序池似乎导致站点能够再次执行安全HTTP请求(尽管它经常在我到达服务器之前修复自己).
use*_*157 18
从2003年到2008 R2迁移后我遇到了完全相同的问题,并找到了解决方案.更改:
Set objhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")
至:
Set objhttp = Server.CreateObject ("MSXML2.XMLHTTP.6.0")
你的问题就会消失
我试图找到两个对象的优缺点,但还没有找到不使用XMLHTTP的理由.
小智 7
我有同样的问题,尝试过各种各样的帖子,但最终没有成功,直到现在.我将详细介绍解决问题的解决方案,因为在我的情况下它是PayPal.我没有开一个新帖子,因为这可能不仅仅是未来的PayPal问题.
该解决方案是针对类似问题的多个stackoverflow发布解决方案的组合,但这似乎是最好的添加.
尝试使用PayPal Sandbox使用经典ASP在Windows Server 2008上测试PayPal IPN会返回错误"安全通道支持中发生错误".
PayPal要求与其系统的所有通信尽可能安全.您将需要一个TLS 1.2连接.默认情况下,Windows Server 2008不是TLS 1.2.
PayPal表示你需要一个Verisign G5证书,而你需要一个Verisign G5证书,你可以为服务器根目录而不是你运行代码的域名.我也没有安装任何PayPal证书,因为我不使用API.我不相信您需要来自HTTPS站点的通信 - 尽管我的域使用标准的GoDaddy EV证书进行保护,尽管我之后在非HTTPS站点上进行了测试,但也有效.
首先通过SSL实验室检查您的服务器正在使用哪种安全性. 应该是TLS1.2或更高版本,没有其他TLS或SSL.它还必须具有SHA256加密.您可能需要修补服务器:https://support.microsoft.com/en-us/kb/3106991.
使用IISCrypto设置正确的TLS和密码.我使用了stackoverflow上其他地方提供的注册表更改,但这不起作用,实际上完全搞砸了我的服务器使用HTTPS帖子,而不仅仅是我的开发网站!IISCrypto还处理密码.
确保您的应用程序池是v4.5,这本身并不清楚,因为IIS可能只提供v4.0作为选项.然而,这实际上可能是v4.5.您可以通过https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx验证这一点.
在您的代码中,您需要使用Server.CreateObject ("MSXML2.XMLHTTP.6.0"),而不是Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")如上所述.
现在我不知道为什么非服务器XMLHTTP工作,因为它似乎与它背后的文档相反.现在,经过10天的压力,恐慌和沮丧我不在乎!我希望这对其他人有用.
找到解决方案是一场噩梦,所以我会在下面添加一些短语来帮助其他人搜索:
PayPal IPN因服务器错误而失败
PayPal SSL Windows 2008错误
安全通道支持发生错误
经典ASP PayPal Sandbox SSL错误
我想公开感谢Rackspace和GoDaddy对此的帮助.我想公开声明我发现PayPal有史以来最糟糕的技术支持,只是不关心,不断指向他们自己的文档,如果他们回应.他们说他们自2014年9月以来一直在发送有关此事的电子邮件,但我从未收到过.这些新要求在PayPal Sandbox上很活跃,但在2016年9月上线.我只是在开发一个新的解决方案,因此需要沙箱 - 如果你正在运行,你将无法知道问题,直到它击中然后你死在水里.尽快在PayPal沙箱上测试您的整个支付系统!
以上答案均不适用于我的情况。然后我跳到这里的链接:
此更新为 Windows Server 2012、Windows 7 Service Pack 1 (SP1) 和 Windows Server 2008 R2 SP1 中的传输层安全性 (TLS) 1.1 和 TLS 1.2 提供支持。
使用 WinHTTP 为使用 WINHTTP_OPTION_SECURE_PROTOCOLS 标志的安全套接字层 (SSL) 连接编写的应用程序和服务不能使用 TLS 1.1 或 TLS 1.2 协议。这是因为此标志的定义不包括这些应用程序和服务。
此更新添加了对 DefaultSecureProtocols 注册表项的支持,允许系统管理员指定在使用 WINHTTP_OPTION_SECURE_PROTOCOLS 标志时应使用哪些 SSL 协议。
这可以允许某些构建为使用 WinHTTP 默认标志的应用程序能够在本地利用较新的 TLS 1.2 或 TLS 1.1 协议,而无需对应用程序进行任何更新。
对于某些 Microsoft Office 应用程序,当它们从 SharePoint 库或 Web 文件夹、用于 DirectAccess 连接的 IP-HTTPS 隧道以及使用 WebClient、WinRM 等技术的其他应用程序打开文档时,就会出现这种情况。
此更新不会更改手动设置安全协议而不是传递默认标志的应用程序的行为。
Client service在Windows 2008 R2服务器出站到服务器上通过 TLS 回应了有问题的错误。我认为这可能是密码套件兼容性。请求中的Wireshark跟踪指示版本Client Hello是 TLS 1.0,但服务器需要 TLS 1.2。从客户端服务发送到出站服务器的密码套件很好。问题是 Windows 服务器上的客户端服务或应用程序默认使用系统默认值,而不是 TLS 1.2。
解决方案是添加一个注册表子项,其名称DefaultSecureProtocols与应支持的 TLS 版本相对应。将带有 type 的上述注册表子项添加DWORD到以下位置:
对于Internet Explorer修复程序,您可以添加标题类似的注册表子项SecureProtocols,还与类型DWORD,到以下地点:
您可以在下面找到两个子项的值表:
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
Run Code Online (Sandbox Code Playgroud)
例如:
管理员想要覆盖 WINHTTP_OPTION_SECURE_PROTOCOLS 的默认值以指定 TLS 1.1 和 TLS 1.2。
取 TLS 1.1 的值 (0x00000200) 和 TLS 1.2 的值 (0x00000800) 然后在计算器中(在程序员模式下)将它们相加,结果注册表值为 0x00000A00。
我应用0x00000A00作为两个子项的值,它成功地解决了这个问题。
如果您不想手动输入注册表子项和值,Microsoft还提供了一个Easy Fix(链接在此处:https : //aka.ms/easyfix51044)。
在 Windows Server 2016 Classic ASP 脚本中,从 Windows Server 2012 R2 获取 HTTPS URL 时,我最近不得不从 SecureProtocols 中删除 SSL 2.0,以阻止此安全通道错误 -2147012739。
' Use the latest client
Set httpClient = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
' allow only TLS 1.2 or TLS 1.1
Const WHR_SecureProtocols = 9
httpClient.Option(WHR_SecureProtocols) = &h0800 + &h0200
' Other values: TLS 1.0 &h0080, SSL 3.0 &h0020, SSL 2.0 &h0008
' NB Including SSL 2.0 stops https to Windows Server 2012 R2 working
' Other options you may want to set, from https://learn.microsoft.com/en-us/windows/desktop/winhttp/winhttprequestoption
' Ignore certificate errors
Const WHR_SslErrorIgnoreFlags = 4
httpClient.Option(WHR_SslErrorIgnoreFlags) = &h3300
' Don't bother checking cert, or risking failure if we can't check
Const WHR_EnableCertificateRevocationCheck = 18
httpClient.Option(WHR_EnableCertificateRevocationCheck) = False
Run Code Online (Sandbox Code Playgroud)
错误代码故障排除:
一些Google-fu发现http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx其中指出:
ERROR_WINHTTP_SECURE_CHANNEL_ERROR
12157
指示发生与安全通道有关的错误(相当于“winerror.h”头文件中列出的以“SEC_E_”和“SEC_I_”开头的错误代码)。
但是,您已经发现了这一点,因为您收到的消息是“描述:安全通道支持中发生错误”。这让我们回到了起点。
我的另一个观察结果是,您的代码是一个非异步 WinHTTP 请求(我知道它必须在 ASP 内部运行),但是,令人担忧的是,由于频率很高,您的计算机可能会处理多个 WinHTTP同时请求。我见过一些 Windows 故意通过阻止延迟请求来限制活动并发 WinHTTP 请求的总数。例如,在 Windows 7 计算机上,进程不能向同一远程服务器发出超过 2 个并发请求。即第三个、第四个...请求将被阻止,直到前两个请求完成。
一种解决方案是在多个应用程序池或多台服务器上对传入请求进行负载平衡。
| 归档时间: |
|
| 查看次数: |
37308 次 |
| 最近记录: |