经典 ASP / IIS6 / Win2003 服务器无法与 TLS 服务器通信

Classic ASP / IIS6 / Win2003 Server can't communicate with TLS server

Sage Pay 今天终止了网站在与其支付/授权服务器通信时使用 SSL3 的豁免。现在需要 TLSv1。

我们有一个 Windows Server 2003 box 运行ning IIS6,还有两个网站(遗憾地)用 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 时不会——如预期的那样。

如果这行得通,为什么其他任何东西都不行 - 当服务器配置的每一点都表明应该如此时?

这是一小段代码示例,returns 上面引用了 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(以 运行 此异步),则脚本 returns 没有任何内容。这个脚本在今天下午 Sage Pay 关闭之前工作。

It doesn't matter what timeouts or options I put on the WinHttp object - it fails so quickly it's almost like it hasn't even tried.

The only error fed back by WinHttpRequest is "-2147483638 - WinHttp.WinHttpRequest - The data necessary to complete this operation is not yet available."

听起来您发出了异步请求但没有等待响应。

首先,需要调用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

我现在已经设法解决了这个问题。在改变我对问题的搜索性质后,我发现 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 - this is the fix for 32 bit English - the hotfix page is here: https://support.microsoft.com/kb/948963) 链接的修补程序 - 并且在重新启动后,一切就绪。

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