【问题标题】:Classic ASP / IIS6 / Win2003 Server can't communicate with TLS server经典 ASP / IIS6 / Win2003 服务器无法与 TLS 服务器通信
【发布时间】:2015-05-21 12:43:20
【问题描述】:

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 管理界面。尽管 SSLv2 和 SSLv3 在 Internet 选项中已关闭,但还是会这样。同样,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 今天下午关闭之前运行。

【问题讨论】:

  • 这可能是相关的 - WinHttp TLS connection in classic asp
  • 在我们提供帮助之前,看看将请求发送到 SagePay 的代码会非常有帮助,否则我们只是在猜测。
  • 谁投票决定将其关闭为“非主题”,因为“关于专业服务器或网络相关基础设施管理的问题已关闭- Stack Overflow 的主题,除非它们直接涉及编程或编程工具。您可以通过 Server Fault 获得帮助。"您的推理有缺陷,这与编程直接相关。
  • 我已经编辑了我的帖子以添加代码示例

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


【解决方案1】:

我在 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

【讨论】:

  • 嗨,谢谢。不幸的是,它立即出现 500 个错误,错误如下: ASP 错误信息:ASP 代码:错误号:-2146893018 源代码:类别:WinHttp.WinHttpRequest 文件中的错误:/ssl_test2.asp 行:14 列:-1 描述.: 收到的消息是意外的或格式错误。第 14 行是 WaitForResponse 行。我应该在我原来的帖子中说,在 Sage Pay 关闭之前,代码运行良好 - 我们有相同的脚本/库在运行更新操作系统的其他服务器上运行。
  • 他们在原始帖子中确实说过他们尝试在 objHTTP.Open() 函数上在 FalseTrue 之间切换,可能是他们在将异步标志设置为 @ 的情况下运行后发布了错误987654326@。感谢为 WinHttpRequestOption_SecureProtocols 指定常量值。
  • 我试过这个,但收到以下错误:Invalid procedure call or argument: 'objHTTP.option'
【解决方案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) - 重新启动后,一切都到位.

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

【讨论】:

  • 还是直接相关的,所以我觉得应该留在这里。通过wscript.exe 运行脚本的修改版本并返回200 的HTTP 状态后,我知道它必须是服务器配置。很高兴它已排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2020-08-05
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多