WinHTTP.WinHTTPRequest.5.1 не работает с песочницей PayPal после TLS 1.2

Песочница PayPal совсем недавно была ограничена подключением TLS 1.2. Это заставляет наш сайт перестать работать с песочницей PayPal, хотя он по-прежнему работает с рабочей версией PayPal. В будущем такое же ограничение будет иметь производственный PayPal. Мы используем классический ASP и компонент Microsoft WinHTTP.WinHTTPRequest.5.1 для связи с PayPal. Вот код ниже. objHttp.StatusText возвращает «Плохой запрос». Мы на Windows Server 2008 R2. Я попытался использовать вместо этого MSXML2.ServerXMLHTTP.6.0, но он работает только на моей машине разработки Windows 8.1, а не на нашем Windows Server 2008 R2. Хотя MSXML2.ServerXMLHTTP.6.0 является надмножеством WinHTTP.WinHTTPRequest.5.1, но он менее надежен, чем WinHTTP.WinHTTPRequest.5.1. Наш код дает сбой несколько раз в день при использовании MSXML2.ServerXMLHTTP.6.0 в прошлом, поэтому я предпочитаю использовать WinHTTP.WinHTTPRequest.5.1. Я также не уверен в этой строке кода: objHttp.Option (9) = & H0AA0. Обходной путь, который мы используем, - это вызов WebAPI для отправки сообщения в PayPal; однако это вызывает дополнительную незначительную задержку.

dim objHttp
Set objHttp = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1")
dim WinHttpRequestOption_EnableHttp1_1 : WinHttpRequestOption_EnableHttp1_1 = 17
objHttp.Option(WinHttpRequestOption_EnableHttp1_1) = False

dim WinHttpRequestOption_SslErrorIgnoreFlags : WinHttpRequestOption_SslErrorIgnoreFlags=4
objHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300
objHttp.setTimeouts 0, 120000, 120000, 120000 
objHttp.Option(9) = &H0AA0 '2720
objHttp.open "post", "" & "https://api-3t.sandbox.paypal.com/2.0/" & "", False
strRequest = SetExpressCheckoutSOAP(returnURL, cancelURL)
objHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
objHttp.setRequestHeader "Content-Length", Len(strRequest)

objHttp.setRequestHeader "Host", "api-3t.sandbox.paypal.com"
Call objHttp.send(strRequest)
if objHttp.Status = 200 then
   resp = objHttp.responseText
else
   response.write objHttp.StatusText
end if

Код вызова WebAPI:

dim webapiresp, webapidata
webapidata = "{""url"":""" & gv_APIEndpoint & """, ""message"":""" & nvpStrComplete & """,""soap"":0}"
webapiresp=InvokeWebAPI(strApiDomain, "POST", "comm/send", "", webapidata)
        set reply=JSON.parse(webapiresp)
        resp = reply.xml

Function InvokeWebAPI(strApiDomain, method, funcname, param, data)
dim HttpReq, apiURI, resp

set HttpReq=Server.CreateObject("MSXML2.ServerXMLHTTP")
'apiURI=strApiDomain & funcname & param
apiURI=strApiDomain & "api/" & funcname & param


HttpReq.open method, apiURI, false

HttpReq.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
HttpReq.setRequestHeader "SOAPAction", apiURI
HttpReq.setRequestHeader "Authorization", "Basic " & Base64Encode("xxx:xxx")

if data <> "" then
    HttpReq.send data
else
    HttpReq.send 
end if

resp = HttpReq.responseText

set HttpReq=Nothing

InvokeWebAPI = resp
End Function

person Phong    schedule 29.01.2016    source источник


Ответы (4)


Мое приложение написано на классическом ASP, и я использую WinHttp.WinHttpRequest.5.1 вместо MSXML2.ServerXMLHTTP.6.0. для публикации на URL-адрес песочницы PayPal.

Для меня работает то, что WinHttp.WinHttpRequest.5.1 objec использует TLS 1.2:

Набор

httpRequest = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
httpRequest.option (9) = 2720

Все это на Windows Server 2012

person ivaylo    schedule 07.05.2016

Такой вариант:

httpRequest.option (9) = 2720

Работает только в Windows 2012 и новее

Системная библиотека winhttp.dll Windows 2008 R2 имеет только запись для TLS 1.0, что равно:

httpRequest.option (9) = 128

Остальные значения отбросят исключение.

Но я нашел решение, которое требует только изменений в реестре, без каких-либо дополнительных изменений кода. Подробности см. Здесь: Классический исходящий TLS-протокол ASP 1.2

person Anton Palyok    schedule 29.08.2016

У меня была точно такая же проблема, но вместо установки option(9) a.k.a WinHttpRequestOption_SecureProtocols мне нужно было добавить поддержку TLS 1.2 в самом WinHttp

См. Статью ниже, где вы можете запустить «Простое исправление» или добавить ключи реестра вручную.

https://support.microsoft.com/en-gb/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-a-default-secure-protocols-in

person uosjead    schedule 06.08.2018

Сначала вам нужно включить поддержку TLS 1.2 на сервере (я предпочитаю использовать бесплатный IISCrypto инструмент от Nartac Software)

Затем вы можете изменить поведение по умолчанию, установив следующий раздел реестра:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800

Если вы используете 32-битные приложения, вам также понадобится этот ключ:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800
person Henrik Høyer    schedule 14.10.2019