我们开始在PHP中使用Guzzle,代码调用各种不同的API,其中一些不支持TLSv1.2,一些需要TLSv1.2。除了我们知道它不会被识别的情况外,强制Guzzle使用最新可用协议的最好方法是什么?
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_SSLVERSION
CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYPEER
CURLOPT_CAINFO
CURLOPT_SSL_CIPHER_LIST
设置正确的CURLOPT_SSL_VERIFYHOST和CURLOPT_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做一些研究,以熟悉弱点、可能的安全选项和最佳实践。“还有一些安全点,我没有说,也是缺失的,但我们不可能面面俱到,这只是冰山一角,没有提到的地方,你自己去研究。”祝您好运!如果可以的话,我会随时回答你的问题。
cygmwpex2#
在Guzzle 5.3中,我不得不使用以下语法:
$guzzle = new \GuzzleHttp\Client([ 'defaults' => [ 'config' => [ 'curl' => [ CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 ] ] ] ]);
eoigrqb63#
在Guzzle 7中,它可以直接在curl下设置为Request Options,这在documentation中没有提到:
curl
$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参考:狂饮源代码
CURL_SSLVERSION_MAX_TLSv1_1
3条答案
按热度按时间cedebl8k1#
它简单易行。
在Guzzle 3.0+中(根据@limos的评论更新):
可以在官方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_VERIFYHOST
CURLOPT_SSL_VERIFYPEER
CURLOPT_CAINFO
(cURL在其网站上提供CA CERTs)CURLOPT_SSL_CIPHER_LIST
设置正确的
CURLOPT_SSL_VERIFYHOST
和CURLOPT_SSL_VERIFYPEER
将防止MITM攻击。CURLOPT_CAINFO
-修复错误:35 -连接中出现未知的SSL协议错误。请提高最大转发保密性。下面是一个cURL密码(
CURLOPT_SSL_CIPHER_LIST
)的列表,它可以提高最大转发保密性:这些密码已根据强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做一些研究,以熟悉弱点、可能的安全选项和最佳实践。
“还有一些安全点,我没有说,也是缺失的,但我们不可能面面俱到,这只是冰山一角,没有提到的地方,你自己去研究。”
祝您好运!
如果可以的话,我会随时回答你的问题。
cygmwpex2#
在Guzzle 5.3中,我不得不使用以下语法:
eoigrqb63#
在Guzzle 7中,它可以直接在
curl
下设置为Request Options,这在documentation中没有提到:此外,如果您想要指定次要TLS版本,您可以使用max选项,例如
CURL_SSLVERSION_MAX_TLSv1_1
。CURL选项参考:CURLOPT_SSLVERSION explained
参考:狂饮源代码