Sage Pay今天结束了他们在与付款/授权服务器通信时使用SSL3的网站的豁免。现在需要TLSv1。
我们有一个运行IIS6的Windows Server 2003盒子,以及在Classic ASP中编写的两个网站(遗憾)。该框已被修补/注册表项更新以减轻POODLE,各种在线检查器支持这一点。服务器应该只使用TLS。
但是,在尝试使用WinHttp.WinHttpRequest.5.1和POST授权Sage Pay事务时,尝试立即失败。 WinHttpRequest反馈的唯一错误是“-2147483638 - WinHttp.WinHttpRequest - 完成此操作所需的数据尚不可用。”
同一服务器上的Internet Explorer也无法访问托管在相同URL上的Sage Pay管理界面。尽管在Internet选项中关闭了SSLv2和SSLv3,但这仍然存在。同样,TLSv1应该是该框中任何可用的唯一选项。
我在WinHttp对象上放置了多少超时或选项 - 它失败的速度很快,几乎就像它没有尝试过一样。
我已经确认有问题的服务器可以使用curl与Sage Pay的服务器通信。 curl在没有指定协议(它使用TLS)或手动指定的情况下工作 - 并且在指定SSL2或3时不会如预期那样工作。
如果可行的话,为什么没有别的 - 当服务器配置的每一位都说它应该?
以下是一小段代码示例,它返回上面引用的WinHttpRequest错误:
<%
VSPServer = "https://test.sagepay.com/showpost/showpost.asp"
Set objHTTP = Server.CreateObject("WinHttp.WinHttprequest.5.1")
On Error Resume Next
objHTTP.Open "POST",CStr(VSPServer),False
objHTTP.Send "Hello"
If Err.Number <> 0 Then
Response.Write "Status: " & objHTTP.Status & "<p>"
Response.Write Err.Number & " - " & Err.Source & " - " & Err.Description
End If
On Error Goto 0
Set objHTTP = Nothing
%>
如果在objHTTP.Open行中将False更改为True(以运行此异步),则脚本不返回任何内容。这个剧本在今天下午Sage Pay关闭之前就有效了。
答案 0 :(得分:2)
我在WinHttp对象上放置了什么超时或选项并不重要 - 它失败得那么快它几乎就像它甚至没有尝试过。
WinHttpRequest反馈的唯一错误是“-2147483638 - WinHttp.WinHttpRequest - 完成此操作所需的数据 尚不可用。“
听起来你已经提出异步请求,但没有等待响应。
首先,您需要通过调用WaitForResponse来解决问题
第二,必须设置哪些安全协议可用于连接。
尝试以下代码,如果问题仍然存在,请告诉我。
Option Explicit
Const WinHttpRequestOption_SecureProtocols = 9
Const SecureProtocol_SSL2 = 8, SecureProtocol_SSL3 = 32, _
SecureProtocol_TLS1 = 128, SecureProtocol_TLS1_1 = 512, _
SecureProtocol_TLS1_2 = 2048
Dim objHTTP
Set objHTTP = Server.CreateObject("WinHttp.WinHttprequest.5.1")
objHTTP.Open "GET", "https://test.sagepay.com/showpost/showpost.asp", True
objHTTP.Option(WinHttpRequestOption_SecureProtocols) = SecureProtocol_TLS1
objHTTP.Send
If objHTTP.WaitForResponse(30) Then 'wait up to 30 seconds
'response is ready
Response.Write "Status : " & objHTTP.Status & "<br />"
Response.Write "Response Length : " & LenB(objHTTP.ResponseBody)
Else
'Request timed out
Response.Write "Request timed out"
End If
Set objHTTP = Nothing
答案 1 :(得分:2)
我现在设法解决了这个问题。在改变搜索问题的性质后,我发现Win2003使用不同的加密算法连接到服务器,甚至通过TLS。它使用3DES,而SagePay则使用AES。 (来源:SagePay Protocol Violation Error)
这导致我安装了Richard Day的答案(http://hotfixv4.microsoft.com/Windows%20Server%202003/sp3/Fix192447/3790/free/351385_ENU_i386_zip.exe - 这是32位英语的修复程序 - 此修补程序页面位于https://support.microsoft.com/kb/948963) - 并且在重新启动后,一切都到位了。
感谢所有提出建议的人。看起来,最终,它在服务器级别是一个问题。如果这需要移动这个帖子(因为它不再与编程相关),那么请这样做。