我们如何在 Guzzle 中指定 TLS/SSL 选项?

2022-08-31 00:47:24

我们开始在PHP中使用Guzzle的代码,这些代码调用各种不同的API,其中一些不支持TLSv1.2,其中一些需要TLSv1.2。

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


答案 1

它简单易行。

$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_SSLVERSIONCURLOPT_SSLVERSIONCURLOPT_SSLVERSION

您可以定义多个安全密码,但只能定义一个 SSL 版本参数。我不会使用任何早于TLS 1.1的东西。任何早期的 SSL 版本都容易受到攻击。版本TLS 1.1也容易受到攻击,但是如果您采用该路线,则可能会在1.2中遇到客户端兼容性问题。唯一安全的(目前,直到他们发现一些漏洞)是TLS 1.2。

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

如果安全性很重要,以下是要查看的其他 cURL 选项:

设置正确,将防止MITM攻击。CURLOPT_SSL_VERIFYHOSTCURLOPT_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

  1. 在您做出决定之前,请先看看Qualys SSL Labs关于安全性的项目。
  2. 看看这篇SSL实验室关于完美前向保密和最佳实践的文章。
  3. 使用SSL Labs的Web工具测试客户端(Web浏览器)是否存在任何漏洞。这将使您了解要查看的内容以及要在服务器和应用程序上进行改进和保护的内容。
  4. 使用Qualys的SSL Labs SSL工具测试您的网站/网络服务。

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

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

无论你构建什么应用,你都应该查看最佳做法,根据你的需求和每个案例,你应该决定以下选项:

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

如果安全性如此重要,请至少使用 TLS1.1。再看看密码列表,我不会忽视这一部分。

下面还有一个很好的 OWASP 指南,用于在应用周围创建安全层

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

有安全点,我没有提到,而且缺失了,但我们不能涵盖一切。这只是冰山一角。这里没有提到的任何东西都是由你研究的。

祝你好运!

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


答案 2

在Guzzle 5.3中,我不得不使用以下语法:

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

推荐