关于贝宝(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
的{{1}},因为我已经读过。.
某些环境可能支持TLS 1.2,但不在默认列表中,因此需要设置SSL版本选项。
现在,我注意到在该PayPal链接上有一个附加查询,它仅提及端点,但是当您向其其他URL发出CURL_SSLVERSION_TLSv1_2
请求时又如何呢?诸如IPN侦听器之类的东西?仍然需要TLS 1.2和HTTP 1.1吗?
答案 0 :(得分:2)
www.paypal.com使用HTTP / 2,如
所示curl --silent --head https://www.paypal.com | head -n 1
HTTP/2 302
根据official docs,您最好的选择是
如果无法使用HTTP / 2,CURL_HTTP_VERSION_2_0
尝试HTTP 2请求。如果无法与服务器协商HTTP 2,则libcurl将回退到HTTP 1.1。
cURL将回退到所需的HTTP / 1.1。
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
此选项可能更好
CURL_HTTP_VERSION_2TLS
仅尝试通过TLS(HTTPS)进行HTTP 2。如果无法与HTTPS服务器协商HTTP 2,则libcurl将回退到HTTP 1.1。对于明文HTTP服务器,libcurl将使用1.1。 (在7.47.0中添加)
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
答案 1 :(得分:2)
也许进一步兼容的最佳和最简单方法就是尝试使您的库(主要是curl
和openssl
(请检查nghttp)保持最新,这可能有助于防止添加一些常量,通过使用定义的“默认值”,一切应该可以正常工作。
从文档中:https://ec.haxx.se/http-versions.html
自2016年中以来,curl将默认使用HTTP / 1.1作为HTTP服务器。如果您连接到HTTPS,并且您的libcurl内置了HTTP / 2功能,则curl将尝试自动使用HTTP / 2或在协商失败的情况下降至1.1。默认情况下,不支持HTTP / 2的curl在HTTPS上获得1.1。