2015-10-14 620 views
8

我们开始在PHP中使用Guzzle,其中的代码调用各种不同的API,其中一些不支持TLSv1.2,其中一些需要TLSv1.2。我们如何在Guzzle中指定TLS/SSL选项?

强迫Guzzle使用可用的最新协议的最佳方式是什么,除非我们知道它不会被识别?

回答

5

它很简单,容易。

$client = new Client(); 
$guzzle = new GuzzleClient('https://www.yourweb.com', array(
    'curl.options' => array(
     CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 
    ) 
)); 
$client->setClient($guzzle); 
... 

在狂饮3.0+(更新按照@limos'评论):

'curl' => array(
    CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 
) 

可能CURLOPT_SSLVERSION选项可以在官方卷曲页中找到:http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html

--- UPDATE (基于评论)---

选择合适的SSL协议版本不仅涉及CURLOPT_SSLVERSION设置,还涉及更多的cURL设置。期望的和重要的结果被称为“最大前向保密”。 这不仅适用于cURL!

您不能使用多个CURLOPT_SSLVERSION参数(至少在Guzzle文档中没有找到这样的选项)。定义CURLOPT_SSLVERSION时,cURL将尝试使用该SSL版本 - 从cURL文档(上面提供的关于CURLOPT_SSLVERSION的链接) - “传递一个长参数来控制要尝试使用的SSL/TLS版本。”

您可以定义多个安全密码,但只能定义一个SSL版本参数。我不会使用TLS 1.1之前的任何内容。任何较早的SSL版本都容易受到攻击。版本TLS 1.1也很容易受到攻击,但如果你走这条路线,那么你可能遇到1.2的客户端兼容性问题。唯一安全的(现在,直到他们发现一些漏洞)是TLS 1.2。

如果安全性是重中之重,请使用可用的最高TLS版本(TLS1.2)。有服务提供商安全责任时,客户端兼容性不是您的问题。

如果安全是非常重要的,这里有其他卷曲选项查看:

设置正确的CURLOPT_SSL _VERIFYHOST和CURLOPT_SSL_VERIFYPEER将防止MITM攻击。

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' 

这些密码都能够抵抗强Qualys公司SSL实验室名单(2014)检查和弱密码被拆除。随意添加/删除任何密码。

如果你仍然想追求多个CURLOPT_SSLVERSION选项,我会写一个脚本来这样做(我认为这不是一个好的做法或必要)。但是,如果您决定以任何理由追求该功能,请编写一些代码,尝试使用最强大的SSL加密,然后回退到下一个版本(如果无法连接)。

  1. 在做出决定之前,请查看Qualys SSL实验室的关于安全性的“projects”。
  2. 看看this SSL Labs' article关于完美的前向保密和最佳实践。
  3. SSL Labs' web tool测试您的客户端(网络浏览器)是否存在任何漏洞。这会给你一个想法,看看你的服务器和应用程序需要改进和保护什么。
  4. 用Qualys的SSL实验室SSL tool测试您的网站/网络服务。

漏洞和攻击:Longjam,FREAK,POODLE,你的名字!谁知道还有哪些其他攻击或漏洞未被发现?是!它们都会影响您对SSL/TLS连接的选择。

您无法控制客户端(除非您开发它),但您可以控制服务器和服务器 - 客户端协商。

不管你建立了什么应用程序,你应该看看最佳实践,根据你的需要和每个案例的基础上,你应该决定下列选项:

  1. 安全
  2. 兼容性
  3. 可维护性
  4. 复杂

如果安全是非常重要的,去TLS1.1最小。 也看看密码列表,我不会忽略那部分。

这也是一个不错的OWASP guide for creating a secure layer围绕你的应用程序。

OWASP和Qualys SSL实验室是开始的很好的资源。我甚至会对cURL和OpenSSL进行一些研究,以便熟悉弱点,可能的安全选项和最佳实践。

有些安全问题,我没有提及,也没有提到,但我们无法涵盖所有​​内容。这只是冰山一角。 这里没有提到的任何东西都是给你研究的。

祝你好运!

如果可以的话,我会回答任何问题。

+0

好了,我们可以把它自动协商(默认值)或仅设置了一个协议版本接受?我希望有一种方法可以给它一套协议版本并让它选择最新版本。 – MattC

+0

正确,你不能使用多个CURLOPT_SSLVERSION参数(至少,我没有在Guzzle文档中找到这样的选项)。当您定义CURLOPT_SSLVERSION时,cURL将尝试使用该SSL版本。从cURL文档(提供的链接)“传递一个长参数来控制要尝试使用的SSL/TLS版本。” 您可以定义多个安全密码,但只能有一个ssl版本参数。我不会使用TLS 1.1之前的任何内容。任何较早的SSL版本都容易受到攻击。 v1.1也很容易受到攻击,但我们会在1.2 – GTodorov

+0

处遇到客户端兼容性问题。我决定更新我的答案,因为您的问题没有简单的答案。 – GTodorov

2

在狂饮5.3,我不得不使用这个语法:

$guzzle = new \GuzzleHttp\Client([ 
    'defaults' => [ 
     'config' => [ 
      'curl' => [ 
       CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 
      ] 
     ] 
    ] 
]); 
相关问题