Bre*_*ett 6 php ssl curl paypal paypal-ipn
关于Paypal最近的安全更新,我已经开始在我的cURL代码中添加两个附加选项,即:
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
Run Code Online (Sandbox Code Playgroud)
我设置CURLOPT_HTTP_VERSION因为不设置它似乎默认为" 让CURL决定使用哪个版本 " -虽然我不想还是喜欢硬编码为未来的兼容性原因的设置,可卷曲被信任总是设置HTTP 1.1是否支持?
其次,我设置CURLOPT_SSLVERSION到6,这是CURL_SSLVERSION_TLSv1_2因为我读了..
某些环境可能具有TLS 1.2,但它不在默认列表中,因此需要设置SSL版本选项.
现在,我注意到在PayPal链接上只有一个额外的查询,它只提到了端点,但是当你cURL向其他URL 发出请求时,如同常见的那样:https://www.paypal.com/cgi-bin/webscr用于IPN监听器之类的东西?这仍然需要TLS 1.2和HTTP 1.1吗?
www.paypal.com 使用 HTTP/2,如下所示
curl --silent --head https://www.paypal.com | head -n 1
HTTP/2 302
Run Code Online (Sandbox Code Playgroud)
根据官方文档,你最好的选择是
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);
Run Code Online (Sandbox Code Playgroud)
这个选项可能会更好
CURL_HTTP_VERSION_2TLS
仅尝试通过 TLS (HTTPS) 的 HTTP 2。如果 HTTP 2 无法与 HTTPS 服务器协商,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);
Run Code Online (Sandbox Code Playgroud)
对于 CURL_HTTP_VERSION_2TLS ,该值似乎是。
CURL_HTTP_VERSION_2TLS = 4
Run Code Online (Sandbox Code Playgroud)
只要libcurl支持包版本支持,就可以使用整数值代替 PHP 常量。
在基于 Linux 的系统上rpm你可以检查
rpm -q libcurl4
libcurl4-7.60.0-lp150.2.6.1.x86_64
Run Code Online (Sandbox Code Playgroud)
与 PHP 比较(命令行)
php -r 'phpinfo();' | grep -i 'curl info'
cURL Information => 7.60.0
Run Code Online (Sandbox Code Playgroud)
还与
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
Run Code Online (Sandbox Code Playgroud)