经典ASP / IIS 6 / Win 2003服务器可以与TLS服务器通信

时间:2015-03-18 16:07:17

标签: iis ssl asp-classic windows-server-2003 sagepay

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关闭之前就有效了。

2 个答案:

答案 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) - 并且在重新启动后,一切都到位了。

感谢所有提出建议的人。看起来,最终,它在服务器级别是一个问题。如果这需要移动这个帖子(因为它不再与编程相关),那么请这样做。