我有一个经典的ASP网站在Windows Server 2012上运行。一个页面使用如下代码通过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
字符串
这段代码几乎在所有时间都能正常工作(每天有数千个请求),但偶尔会失败,并显示这样的消息:
电话:+86-2147012739
说明:安全通道支持中出现错误
源代码:msxml6.dll
该应用程序最近从旧的Windows 2003服务器移动到2012服务器,这个问题似乎从来没有在旧服务器上的问题。此外,虽然这个错误发生在网站上,我可以在VBScript中运行完全相同的代码,它工作得很好。重置应用程序池似乎会导致网站能够再次进行安全的HTTP请求(虽然它经常在我到达服务器之前就修复了自己)。
9条答案
按热度按时间wyyhbhjk1#
我在从2003迁移到2008 R2后遇到了完全相同的问题,并找到了解决方案。
第一个月
收件人:
Set objhttp = Server.CreateObject ("MSXML2.XMLHTTP.6.0")
个你的问题就解决了
我试图找出这两种对象的优缺点,但还没有找到不使用XMLHTTP的理由。
m1m5dgzv2#
我有同样的问题,并尝试了很多解决方案下提供的各种职位,但最终没有成功,直到现在.我将详细说明解决方案,为我工作的问题,因为在我的情况下,这是贝宝.我没有打开一个新的职位,因为这可能不只是贝宝的问题,在未来.
解决方案是一个组合的一些stackoverflow张贴解决类似的问题,但这似乎是最好的一个添加。
问题是
尝试使用PayPal Sandbox在Windows Server 2008上使用经典ASP测试PayPal IPN会返回错误“An error occurred in the secure channel support”。
为什么这是个问题
PayPal要求与其系统的所有通信都尽可能安全。您将需要TLS 1.2连接。Windows Server 2008默认情况下不是TLS 1.2。
贝宝抛出了一些混乱的组合说,你需要一个威瑞信G5证书,你为服务器根,但不是域你正在运行你的代码。我也没有安装任何贝宝证书,因为我不使用API。我不相信你需要你的通信从HTTPS网站-虽然我的域名是使用标准的GoDaddy EV证书保护的,但我在一个非HTTPS网站上做了测试,这也起作用了。
我的解决方案
1.首先通过SSL Labs检查您的服务器使用的是哪种安全性。它应该是TLS1.2或更高,并且没有其他TLS或SSL。它还必须具有SHA 256加密。您可能需要为服务器打补丁:https://support.microsoft.com/en-us/kb/3106991。
1.使用IISCrypto设置正确的TLS和密码.我使用了stackoverflow上其他地方提供的注册表更改,但这不起作用,实际上完全搞砸了我的服务器,因为所有使用HTTPS的帖子,而不仅仅是我的开发网站!IISCrypto也处理密码。
1.请确保您的应用程序池是v4.5,这本身并不清楚,因为IIS可能只提供v4.0作为一个选项。但这可能实际上是v4.5。您可以通过https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx验证这一点。
1.在你的代码中,你需要使用
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在这方面的帮助。我想公开声明,我发现贝宝有史以来最糟糕的技术支持,只是不在乎,不断指向自己的文档,如果他们曾经回应。他们说,他们已经发送了电子邮件,自2014年9月以来,但我从来没有收到过一个。这些新的要求是积极的贝宝沙盒,但去生活在2016年9月。我只是偶然发现它作为开发一个新的解决方案,所以需要沙箱-如果你运行现场,你不会知道的问题,直到它击中,然后你死在水里。尽快测试你的整个支付系统上贝宝沙箱是我的建议!!
uqcuzwp83#
上面的答案都不适用于我的情况。然后我跳上了这里的链接:
https://support.microsoft.com/en-za/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-a-default-secure-protocols-in
通过TLS出站到服务器的
Windows 2008 R2
服务器上的Client service
返回了有问题的错误。我认为这可能是密码套件兼容性。Wireshark
跟踪表明Client Hello
请求中的版本是TLS 1.0,但服务器需要TLS 1.2。从客户端服务发送到出站服务器的密码套件正常。问题是Windows服务器上的客户端服务或应用程序默认使用系统默认值,不是TLS 1.2。解决方案是添加一个名为
DefaultSecureProtocols
的注册表子项,其值对应于应支持的TLS版本。将所述注册表子项添加到以下位置,类型为DWORD
:*HKEY_KEY_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
*HKEY_LOCAL_CINE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
对于Internet Explorer修复,您可以添加一个类似的注册表子项标题为
SecureProtocols
,也与类型DWORD
,到以下位置:*HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
*HKEY_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
下面你可以找到这两个子键的值表:
字符串
我将0x 00000 A00作为两个子项的值,成功解决了这个问题。
如果您不希望手动输入注册表子项和值,Microsoft也提供了一个Easy Fix(链接在这里:https://aka.ms/easyfix51044)。
dauxcl2d4#
在Windows Server 2016 Classic ASP脚本中,从Windows Server 2012 R2获取HTTPS URL,我最近不得不从SecureProtocols中删除SSL 2.0以阻止此安全通道错误-2147012739。
字符串
ej83mcc05#
这一切都是有效的,但是在Windows 7上使用IIS 7.5和经典asp的TLS1.2支持的“关键”缺失位在注册表中设置为:
字符串
我希望这能为你节省一天的时间,重新启动和挠头!:)
此代码片段对于测试很有用。https://www.howsmyssl.com/
型
hm2xizp96#
故障排 debugging 误代码:
1.-2147012739是一个HRESULT。
1.在十六进制中是0x 80072 F7 D。
1.查看LOWORD:0x 2F 7 D。
1.把它转换成十进制:12157。
1.找到它匹配:ERROR_WINHTTP_SECURE_CHANNEL_ERROR
一点Google-fu找到http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx,它说:
错误_WINHTTP_SECURE_CHANNEL_ERROR
12157
指示发生了与安全通道有关的错误(相当于“winerror.h”头文件中列出的以“SEC_E_”和“SEC_I_”开始的错误代码)。
然而,你已经发现了这一点,因为你得到的消息是“描述:安全通道支持中出现错误”。所以这将我们带回到我们开始的地方。
我观察到的另一点是,您的代码是一个非异步WinHTTP请求(我知道它必须在ASP中运行),但是,令人担忧的是,由于频率很高,您的机器可能会同时处理多个WinHTTP请求。我见过一些Windows故意通过阻止迟到的请求来限制活动并发WinHTTP请求的总数。例如,在Windows 7机器上,进程不能向同一个远程服务器发出2个以上的并发请求。即,第3个,第4个...请求将被阻止,直到前两个完成。
一种解决方案是在多个应用程序池或多个服务器上对传入请求进行负载平衡。
guykilcj7#
我们在这个问题上有一个变化,它真的花了我们一些时间来弄清楚。
情况是这样的:一个较旧的Linux服务器,托管一个用PHP编写的应用程序,并通过Web服务调用提供数据。该服务器使用HTTPS。来自各种客户端的调用是使用winHTTP 5.2库的代码进行的。(Winhttp.dll)
症状:我们的客户端现在在使用“POST”命令进行重复的winHTTP调用时收到零星的错误消息。这些消息要么是“提供给函数的缓冲区太小。”要么是“安全通道支持中发生错误”。经过多次搜索,我们发现客户端的服务器正在记录“Schannel Event ID 36887 alert code 20”与可见错误消息对应的事件查看器中。
解决方法:我们发现旧的Linux服务器不支持TLS 1.2。(CentOS 5.11)我们还了解到,我们的几个客户最近(2016年夏季)将更新应用于其Microsoft服务器。(服务器2008,服务器2012)修复是强制他们的服务器使用TLS 1.1进行Web服务调用。更改TLS对问题没有影响。但是,通过更改组策略中的设置,我们能够解决问题。我们的技术顾问指出,这种更改非常模糊,但第三个第三方供应商提供了一个快速解决方案。该工具被称为Nartac的IIS Crypto。https://www.nartac.com/Products/IISCrypto/Download该工具可以让您专门选择协议。我们现在有一个新的服务器托管我们的应用程序(CentOS 6),然后应该能够使用TLS 1.2协议!
yk9xbfzb8#
几个月前,我自己也遇到了这个错误。大多数情况下,这个问题是由无效的SSL证书引起的。考虑到在发帖时您刚刚迁移到新服务器,您可能只需要重新安装SSL证书。
我知道这个问题很老了,但希望其他人能从我的回答中受益。
up9lanfz9#
同样为了帮助任何可能遇到此问题的人,我们在从Windows Server 2012升级到2019后遇到了类似的问题。问题是一些使用MSXML 6 DLL的自定义代码。升级后,我们开始使用MSxml2.XMLHTTP.6.0对象的Send()方法获得12029错误。
在应用Windows服务堆栈和其他更新后,错误变为12157。使用IISCrypto进行的一些实验使我们确定以下密码(在Win 2012下启用)必须在就地升级禁用后重新启用。
TLS_ECDHE_RSA_CRU_AES_256_GCM_SHA384
升级/更新后的MSXML6.DLL版本为6.30.17763.2989