WinHTTP.WinHTTPRequest.5.1 在 TLS 1.2 之后不适用于 PayPal 沙箱

Posted

技术标签:

【中文标题】WinHTTP.WinHTTPRequest.5.1 在 TLS 1.2 之后不适用于 PayPal 沙箱【英文标题】:WinHTTP.WinHTTPRequest.5.1 does not work with PayPal sandbox after TLS 1.2 【发布时间】:2016-05-07 12:08:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我的应用程序是用 ASP 经典编写的,我使用 WinHttp.WinHttpRequest.5.1 代替 MSXML2.ServerXMLHTTP.6.0。发布到贝宝沙盒网址。

对我有用的是告诉WinHttp.WinHttpRequest.5.1 objec 使用 TLS 1.2:

设置

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

Windows Server 2012 上的所有功能

【讨论】:

【参考方案2】:

这个选项:

httpRequest.option (9) = 2720

仅适用于 Windows 2012 及更新版本

Windows 2008 R2 的系统库“winhttp.dll”只有 TLS 1.0 的记录等于:

httpRequest.option (9) = 128

其他值将丢弃异常。

但我找到了一个解决方案,它只需要更改注册表,无需对代码进行任何额外更改。 在此处查看详细信息: Classic ASP Outbound TLS 1.2

【讨论】:

【参考方案3】:

我遇到了完全相同的问题,但我需要在 WinHttp 本身中添加对 TLS 1.2 的支持,而不是设置 option(9) a.k.a WinHttpRequestOption_SecureProtocols

请参阅下面的文章,您可以在其中运行“Easy Fix”或手动添加注册表项

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

【讨论】:

【参考方案4】:

首先您需要在服务器上启用对 TLS 1.2 的支持(我更喜欢使用来自 Nartac Software 的免费 IISCrypto 工具)

然后您可以通过设置以下注册表项来更改默认行为:

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

【讨论】:

以上是关于WinHTTP.WinHTTPRequest.5.1 在 TLS 1.2 之后不适用于 PayPal 沙箱的主要内容,如果未能解决你的问题,请参考以下文章

WinHttpRequest 超时

在VBA WinHttpRequest上捕获超时

VBS通过WinHttp对象下载网页图片。

http伪造,(asp的)好用,成功!

VBA 学习笔记 - 网络请求

VBA 学习笔记 - 网络请求