2015-03-18 4 views
4

Sage Pay сегодня завершил освобождение сайтов, использующих SSL3 при общении со своими серверами оплаты/авторизации. TLSv1 теперь требуется.Классический сервер ASP/IIS6/Win2003 не может связываться с сервером TLS

У нас есть окно Windows Server 2003 с IIS6 и два сайта, написанных (к сожалению) в классическом ASP. Ящик был исправлен/ключи реестра обновлены для смягчения против POODLE, и различные онлайн-шашки поддерживают это. Сервер должен использовать ТОЛЬКО TLS.

Однако при попытке авторизации транзакции Sage Pay с использованием WinHttp.WinHttpRequest.5.1 и POST попытка немедленно прекращается. Единственная ошибка, возвращаемая WinHttpRequest, - «-2147483638 - WinHttp.WinHttpRequest - данные, необходимые для завершения этой операции, пока недоступны».

Internet Explorer на том же сервере также не может получить доступ к интерфейсам администрирования Sage Pay, размещенным на тех же URL-адресах. Это, несмотря на то, что SSLv2 и SSLv3 отключены в Internet Options. Опять же, TLSv1 должен быть единственным вариантом, доступным для НИЧЕГО на коробке.

Не имеет значения, какие тайм-ауты или варианты я накладываю на объект WinHttp - он не так быстро, что почти так же, как он даже не пытался.

Я проверил, что сервер, о котором идет речь, может связываться с серверами Sage Pay, используя curl. 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 
%> 

Если значение False изменяется на True (для запуска этого асинхра) в строке objHTTP.Open, скрипт ничего не возвращает. Этот скрипт работал до того, как Sage Pay вошел во второй половине дня.

+1

Пожалуйста, [покажите нам свой код] (http://stackoverflow.com/help/mcve). – GoBusto

+0

Возможно, это связано с [WinHttp TLS соединение в классическом asp] (http://stackoverflow.com/q/29098446/692942) – Lankymart

+1

Прежде чем мы сможем помочь, было бы очень полезно увидеть код, который отправляет запрос SagePay, иначе мы просто догадываемся. – Lankymart

ответ

2

Мне удалось это решить. После изменения характера поиска проблемы я обнаружил, что Win2003 использует другой алгоритм шифрования для подключения к серверам даже через TLS. Он использует 3DES, тогда как SagePay ожидает AES. (Источник: SagePay Protocol Violation Error)

Это привело меня установить исправление, связанное с ответом Ричарда Дэя (http://hotfixv4.microsoft.com/Windows%20Server%202003/sp3/Fix192447/3790/free/351385_ENU_i386_zip.exe - это исправление для 32 битных английского языка - страница исправления здесь: https://support.microsoft.com/kb/948963) - и, после перезагрузки, все встало на место.

Благодарим всех, кто внес предложения. Похоже, в конце концов, это была проблема на уровне сервера.Если это требует, чтобы этот пост был перемещен (поскольку он больше не связан с программированием), пожалуйста, сделайте это.

+1

Он по-прежнему напрямую связан, поэтому я думаю, что он должен оставаться здесь. После запуска модифицированной версии вашего скрипта через 'wscript.exe' и возвращения HTTP-статуса' 200' я знал, что это должна быть конфигурация сервера. Рад, что он отсортирован. – Lankymart

2

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 
+0

Привет, и спасибо за это. К сожалению, 500 ошибок мгновенно с погрешностью быть следующим: ASP ОШИБКА ИНФОРМАЦИЯ: ASP код: Ошибка No .: -2146893018 Исходный код: Категория: WinHttp.WinHttpRequest Ошибка в файле: /ssl_test2.asp Строка: 14 Столбец: -1 Описание: Полученное сообщение было неожиданным или сильно отформатированным. Строка 14 - линия WaitForResponse. Я должен был сказать в своем оригинальном посте, что код работал отлично до того, как Sage Pay отключил все, - и у нас есть тот же скрипт/библиотека, который работает на других серверах, на которых работают более современные ОС. – MikkyX

+0

Они сказали в оригинальной записи, что они пытались переключиться между 'False' и' True' на 'objHTTP.Open() 'возможно, что они просто отправили сообщение об ошибке после запуска с флагом async, установленным на' True'. Претензии для указания постоянных значений для 'WinHttpRequestOption_SecureProtocols'. – Lankymart

+0

Я пробовал это, но получил следующую ошибку: 'Неверный вызов или аргумент процедуры: 'objHTTP.option'' – kneidels

 Смежные вопросы

  • Нет связанных вопросов^_^