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_0
或 CURL_HTTP_VERSION_2TLS
标志的 PHP 文档。
感谢您的更新。顺便说一句,我认为您将这一点重新放在了前面defined('CURL_VERSION_HTTP2') || define('CURL_VERSION_HTTP2', 65536);
- HTTP
之前 VERSION
。
正确,现在已修复。只要您使用相同的常量,它就可以正常工作,但必须与文档保持一致。【参考方案2】:
可能最好和最简单的进一步兼容的方法就是尝试让你的库保持最新,主要是curl
和openssl
(检查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
如何使 Windows 商店应用程序与 TLS 1.2 一起使用?