PayPal 最近的 TLS 1.2 / HTTP 1.1 更新以及何时使用

Posted

技术标签:

【中文标题】PayPal 最近的 TLS 1.2 / HTTP 1.1 更新以及何时使用【英文标题】:PayPal's recent TLS 1.2 / HTTP 1.1 updates and when to use it 【发布时间】:2018-12-22 13:57:30 【问题描述】:

关于 Paypal 最近的 security update,我已经开始在我的 cURL 代码中添加两个附加选项,它们是:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_SSLVERSION, 6);

我设置了CURLOPT_HTTP_VERSION,因为没有设置它似乎默认为“让 CURL 决定使用哪个版本” - 虽然出于未来兼容性原因,我不想或不喜欢硬编码设置,如果支持可用,是否可以信任 cURL 始终设置 HTTP 1.1

其次,我将CURLOPT_SSLVERSION 设置为6,即CURL_SSLVERSION_TLSv1_2,因为我已经阅读了...

某些环境可能支持 TLS 1.2,但它不在默认列表中,因此需要设置 SSL 版本选项。

现在,我注意到另一个查询是在 PayPal 链接上,它只提到了端点,但是当您向其他 URL 发出 cURL 请求时怎么样:https://www.paypal.com/cgi-bin/webscr 用于诸如IPN 听众?这是否仍然需要 TLS 1.2 和 HTTP 1.1?

【问题讨论】:

(a) 尝试时发生了什么? (b) 为什么不直接使用它并且对所有东西都使用相同的配置? @EJP 好吧,它似乎可以工作,但是最好简要了解处理所有这些问题的最佳方式,以便将来兼容,如果我这样做的方式也是推荐的方法作为我的其他问题。 我们已经默认使用 HTTP/1.1 很久了,我从来不需要使用 CURL_HTTP_VERSION_1_1 选项。有什么理由需要设置吗? @apokryfos 我猜只是没有将其设置为“默认,让 CURL 决定使用哪个版本”的描述有点含糊;如果它说它总是尽可能选择支持的最新版本,我会感觉更舒服。 您是否有理由不只是使用他们的 SDK 与他们的服务器交互? 【参考方案1】:

www.paypal.com 正在使用 HTTP/2,如

所示
curl --silent --head https://www.paypal.com | head -n 1
HTTP/2 302

根据official docs,你最好的选择是

CURL_HTTP_VERSION_2_0

尝试 HTTP 2 请求。如果无法与服务器协商 HTTP 2,libcurl 将回退到 HTTP 1.1。

如果无法使用 HTTP/2,cURL 将回退到所需的 HTTP/1.1。

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);

这个选项可能会更好

CURL_HTTP_VERSION_2TLS

仅尝试基于 TLS (HTTPS) 的 HTTP 2。如果 HTTP 2 无法与 HTTPS 服务器协商,libcurl 将回退到 HTTP 1.1。对于明文 HTTP 服务器,libcurl 将使用 1.1。 (在 7.47.0 中添加)

对于php cURL extension docs

CURL_HTTP_VERSION_2(整数) 自 PHP 7.0.7 和 cURL 7.43.0 起可用 CURL_HTTP_VERSION_2TLS(整数) 自 PHP 7.0.7 和 cURL 7.47.0 起可用

如果您的 PHP 版本没有定义这些常量,您可以尝试类似

defined('CURL_HTTP_VERSION_2_0') || define('CURL_HTTP_VERSION_2_0', 65536);

对于 CURL_HTTP_VERSION_2TLS,该值似乎是。

CURL_HTTP_VERSION_2TLS = 4

只要 libcurl 支持包版本支持,使用整数值而不是 PHP 常量就可以工作。

在基于 rpm 的 Linux 上,您可以检查

rpm -q libcurl4
libcurl4-7.60.0-lp150.2.6.1.x86_64

与 PHP 比较(命令行)

php -r 'phpinfo();' | grep -i 'curl info'
cURL Information => 7.60.0

还有

php -r 'print_r(curl_version());' | grep 'version'
[version_number] => 474112
[ssl_version_number] => 0
[version] => 7.60.0
[ssl_version] => OpenSSL/1.1.0h
[libz_version] => 1.2.11

【讨论】:

感谢您的信息。抱歉,忘了说我使用的是 PHP(刚刚添加了标签);不幸的是,查看他们目前没有提到 CURL_HTTP_VERSION_2_0CURL_HTTP_VERSION_2TLS 标志的 PHP 文档。 感谢您的更新。顺便说一句,我认为您将这一点重新放在了前面defined('CURL_VERSION_HTTP2') || define('CURL_VERSION_HTTP2', 65536); - HTTP 之前 VERSION 正确,现在已修复。只要您使用相同的常量,它就可以正常工作,但必须与文档保持一致。【参考方案2】:

可能最好和最简单的进一步兼容的方法就是尝试让你的库保持最新,主要是curlopenssl(检查nghttp),这可能有助于防止添加一些常量并通过使用定义的“默认值”应该可以正常工作。

来自文档:https://ec.haxx.se/http-versions.html

也许从 2016 年年中开始,curl 将默认为 HTTP 服务器使用 HTTP/1.1。如果你连接到 HTTPS 并且你有一个内置 HTTP/2 功能的 libcurl,curl 将尝试自动使用 HTTP/2,或者在协商失败的情况下降到 1.1。默认情况下,不支持 HTTP/2 的 curls 通过 HTTPS 获得 1.1。

【讨论】:

以上是关于PayPal 最近的 TLS 1.2 / HTTP 1.1 更新以及何时使用的主要内容,如果未能解决你的问题,请参考以下文章

TLS 1.2 升级 errno 54 后 PayPal 沙箱 API SSL 错误

获取 Paypal 响应 TLS 1.2 .Net Framework 4.0

Payflow Pro和TLS 1.2通过COM DLL

如何使 Windows 商店应用程序与 TLS 1.2 一起使用?

如何解决:对应的服务器 tls 为 tls 1.0,小程序要求的TLS版本必须大于等于1.2问题

如何解决:对应的服务器 tls 为 tls 1.0,小程序要求的TLS版本必须大于等于1.2问题