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

slsn1g29  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(779)

我们开始在PHP中使用Guzzle,代码调用各种不同的API,其中一些不支持TLSv1.2,一些需要TLSv1.2。
除了我们知道它不会被识别的情况外,强制Guzzle使用最新可用协议的最好方法是什么?

cedebl8k

cedebl8k1#

它简单易行。

$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页面找到可能的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的链接)-“传递一个长参数as以控制尝试使用哪个版本的SSL/TLS。”
您可以定义多个安全密码,但只能定义一个SSL版本参数。我不会使用任何早于TLS 1.1的版本。任何早期的SSL版本都容易受到攻击。TLS 1.1版本也容易受到攻击,但如果您采用该方法,您可能会遇到1.2版本的客户端兼容性问题。唯一安全的(目前,直到他们发现一些漏洞)是TLS 1.2。
如果安全性是最重要的,请使用可用的最高TLS版本(TLS1.2)。当服务提供商有安全责任时,客户端兼容性不是您的问题。
如果安全性很重要,可以参考以下其他cURL选项:

设置正确的CURLOPT_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYPEER将防止MITM攻击。
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)进行检查,弱密码已被删除。请随意添加/删除任何密码。
如果您仍然想使用多个CURLOPT_SSLVERSION选项,我会编写一个脚本来实现(我认为这不是一个好的实践或必要的)。但是,如果您出于任何原因决定使用该功能,请编写一些代码,尝试使用最强的SSL加密,然后在连接失败时回退到下一个版本。
1.在您做出决定之前,请查看Qualys SSL实验室关于安全性的projects
1.请看this SSL Labs' article中关于完美前向保密和最佳实践的内容。
1.用SSL Labs' web tool测试你的客户端(网页浏览器)是否有漏洞。这将给予你知道在你的服务器和应用程序上要看什么,要改进和保护什么。
1.使用Qualys的SSL Labs SSL tool测试您的网站/Web服务。
漏洞和攻击:Longjam,FREAK,POODLE,你能想到的!谁知道还有什么其他的攻击或漏洞没有被发现?是的!它们都会影响你对SSL/TLS连接的选择。
您无法控制客户端(除非您开发它),但可以控制服务器和服务器-客户端协商。
无论您构建什么应用程序,都应该考虑最佳实践,根据您的需求和具体情况,您应该决定以下选项:
1.安全性
1.兼容性
1.可维护性
1.复杂性
如果安全性是如此重要,那么最低限度使用TLS1.1。还要查看密码列表,我不会忽略这一部分。
这里也有一个很好的OWASP guide for creating a secure layer围绕你的应用程序。
OWASP和Qualys SSL实验室是很好的资源,我甚至会对CURL和OpenSSL做一些研究,以熟悉弱点、可能的安全选项和最佳实践。
“还有一些安全点,我没有说,也是缺失的,但我们不可能面面俱到,这只是冰山一角,没有提到的地方,你自己去研究。”
祝您好运!
如果可以的话,我会随时回答你的问题。

cygmwpex

cygmwpex2#

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

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

eoigrqb63#

在Guzzle 7中,它可以直接在curl下设置为Request Options,这在documentation中没有提到:

$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");

此外,如果您想要指定次要TLS版本,您可以使用max选项,例如CURL_SSLVERSION_MAX_TLSv1_1
CURL选项参考:CURLOPT_SSLVERSION explained
参考:狂饮源代码

相关问题