我们如何在 Guzzle 中指定 TLS/SSL 选项?
我们开始在PHP中使用Guzzle的代码,这些代码调用各种不同的API,其中一些不支持TLSv1.2,其中一些需要TLSv1.2。
强制Guzzle使用最新的可用协议的最佳方法是什么,除非我们知道它不会被识别?
我们开始在PHP中使用Guzzle的代码,这些代码调用各种不同的API,其中一些不支持TLSv1.2,其中一些需要TLSv1.2。
强制Guzzle使用最新的可用协议的最佳方法是什么,除非我们知道它不会被识别?
它简单易行。
$client = new Client();
$guzzle = new GuzzleClient('https://www.yourweb.com', array(
'curl.options' => array(
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
)
));
$client->setClient($guzzle);
...
在Guzzle 3.0+中(根据@limos的评论更新):
'curl' => array(
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
)
可以在官方的cURL页面上找到可能的选项:http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.htmlCURLOPT_SSLVERSION
---更新(基于评论)---
选择正确的SSL协议版本不仅涉及设置,还涉及更多的cURL设置。期望的和重要的结果被称为“最大前向保密”。这不仅对 cURL 有效!CURLOPT_SSLVERSION
你不能使用多个参数(至少,我在Guzzle文档中没有找到这样的选项)。当您定义时,cURL 将尝试使用该 SSL 版本 - 从 cURL 文档(上面提供的有关的链接)中 - “传递一个 long as 参数来控制尝试使用哪个版本的 SSL/TLS。CURLOPT_SSLVERSION
CURLOPT_SSLVERSION
CURLOPT_SSLVERSION
您可以定义多个安全密码,但只能定义一个 SSL 版本参数。我不会使用任何早于TLS 1.1的东西。任何早期的 SSL 版本都容易受到攻击。版本TLS 1.1也容易受到攻击,但是如果您采用该路线,则可能会在1.2中遇到客户端兼容性问题。唯一安全的(目前,直到他们发现一些漏洞)是TLS 1.2。
如果安全性是重中之重,请使用最高的可用 TLS 版本 (TLS1.2)。当存在服务提供商安全责任时,客户端兼容性不是您的问题。
如果安全性很重要,以下是要查看的其他 cURL 选项:
CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYPEER
CURLOPT_CAINFO
(cURL在其网站上提供CA CERTs)CURLOPT_SSL_CIPHER_LIST
设置正确,将防止MITM攻击。CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYPEER
CURLOPT_CAINFO
- 修复错误:35 - 连接中出现未知的 SSL 协议错误。提高最大的前向保密性。
以下是要查看的cURL密码()的列表,这将提高最大的前向保密性: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'
这些密码已根据强Qualys SSL Labs列表(2014)进行了检查,并删除了弱密码。随意添加/删除任何密码。
如果你仍然想追求多种选择,我会写一个脚本来做到这一点(我不认为这是一个好的做法或必要)。但是,如果您出于任何原因决定追求该功能,请编写一些代码,这些代码将尝试使用最强的SSL加密,然后在无法连接时回退到下一个版本。CURLOPT_SSLVERSION
漏洞和攻击:Longjam,FREAK,POODLE,你的名字!谁知道还有哪些其他攻击或漏洞未被发现?是的!它们都会影响您选择的 SSL/TLS 连接。
您无法控制客户端(除非您开发它),但您可以控制服务器和服务器-客户端协商。
无论你构建什么应用,你都应该查看最佳做法,根据你的需求和每个案例,你应该决定以下选项:
如果安全性如此重要,请至少使用 TLS1.1。再看看密码列表,我不会忽视这一部分。
下面还有一个很好的 OWASP 指南,用于在应用周围创建安全层。
OWASP和Qualys SSL Labs是很好的资源。我甚至会对cURL和OpenSSL进行一些研究,以熟悉弱点,可能的安全选项和最佳实践。
有安全点,我没有提到,而且缺失了,但我们不能涵盖一切。这只是冰山一角。这里没有提到的任何东西都是由你研究的。
祝你好运!
如果可以的话,我会回答任何问题。
在Guzzle 5.3中,我不得不使用以下语法:
$guzzle = new \GuzzleHttp\Client([
'defaults' => [
'config' => [
'curl' => [
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
]
]
]
]);