我们开始在 PHP 中使用 Guzzle 来调用各种不同的 API,其中一些 API 不支持 TLSv1.2,而另一些则需要 TLSv1.2。
除了我们知道某些 API 不支持最新协议的情况外,强制 Guzzle 使用最新可用的协议是最好的方法。
这很简单易懂。
$client = new Client();
$guzzle = new GuzzleClient('https://www.yourweb.com', array(
'curl.options' => array(
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
)
));
$client->setClient($guzzle);
...
'curl' => array(
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
)
可以在官方cURL页面找到可能的CURLOPT_SSLVERSION
选项: http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html
--- 更新(根据评论) ---
选择适当的SSL协议版本不仅涉及CURLOPT_SSLVERSION
设置,还涉及许多cURL设置。期望的重要结果称为“最大前向保密性”。
这不仅适用于cURL!
您无法使用多个CURLOPT_SSLVERSION
参数(至少我没有在Guzzle文档中找到这样的选项)。当您定义CURLOPT_SSLVERSION
时,cURL将尝试使用该SSL版本 - 来自cURL文档(有关CURLOPT_SSLVERSION
的上面提供的链接) - “传递长参数以控制要尝试使用的SSL / TLS版本。”
CURLOPT_SSL_VERIFYHOST
(设置正确的值可以防止中间人攻击)CURLOPT_SSL_VERIFYPEER
(设置正确的值可以防止中间人攻击)CURLOPT_CAINFO
(cURL在其网站上提供CA证书)CURLOPT_SSL_CIPHER_LIST
(设置加密套件列表,以改善最大前向保密性)设置正确的CURLOPT_SSL_VERIFYHOST
和CURLOPT_SSL_VERIFYPEER
将防止中间人攻击。
CURLOPT_CAINFO
- 修复错误:35-连接中未知的SSL协议错误。改善最大前向保密性。
CURLOPT_SSL_CIPHER_LIST
),可以提高最大前向保密性,请参考:
'DHE-RSA-AES256-SHA',
'DHE-DSS-AES256-SHA',
'AES256-SHA',
'ADH-AES256-SHA',
'KRB5-DES-CBC3-SHA',
'EDH-RSA-DES-CBC3-SHA',
'EDH-DSS-DES-CBC3-SHA',
'DHE-RSA-AES128-SHA',
'DHE-DSS-AES128-SHA',
'ADH-AES128-SHA',
'AES128-SHA',
'KRB5-DES-CBC-SHA',
'EDH-RSA-DES-CBC-SHA',
'EDH-DSS-DES-CBC-SHA:DES-CBC-SHA',
'EXP-KRB5-DES-CBC-SHA',
'EXP-EDH-RSA-DES-CBC-SHA',
'EXP-EDH-DSS-DES-CBC-SHA',
'EXP-DES-CBC-SHA'
CURLOPT_SSLVERSION
选项,我建议编写一个脚本来实现(我认为这不是一个好的做法或必要的)。但是,如果您因为任何原因决定追求该功能,请编写一些代码,尝试使用最强大的SSL加密,如果连接失败,则回退到下一个版本。
漏洞和攻击:Longjam,FREAK,POODLE等等!谁知道还有什么其他攻击或漏洞是未被发现的?是的!它们都会影响您选择SSL / TLS连接。
您无法控制客户端(除非您开发它),但可以控制服务器和服务器-客户端协商。
无论您构建什么应用程序,都应该查看最佳实践,根据您的需求和每种情况,您应该决定以下选项:如果安全性非常重要,请至少选择TLS1.1。 还要查看密码列表,我不会忽略那一部分。
这里还有一个很好的OWASP创建安全层指南。
OWASP和Qualys SSL Labs是很好的起点。我甚至会研究cURL和OpenSSL以熟悉弱点、可能的安全选项和最佳实践。
有一些安全问题我没有提到并且遗漏了,但我们无法涵盖所有内容。这只是冰山一角。 这里未提到的任何内容都需要您进行研究。
祝你好运!
如果可以,我会在附近回答任何问题。
$guzzle = new \GuzzleHttp\Client([
'defaults' => [
'config' => [
'curl' => [
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
]
]
]
]);
$client = new \GuzzleHttp\Client();
$res = $client->request('GET', 'https://www.howsmyssl.com/a/check', [
'curl' => [
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
],
]);
$body = $res->getBody();
echo ($body ? json_decode($body, true)['tls_version'] : "Request failed");
CURL_SSLVERSION_MAX_TLSv1_1
。