我们如何在 Guzzle 中指定 TLS/SSL 选项?
How do we specify TLS/SSL options in 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 页面找到可能的 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
的 link)——“传递一个 long 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 provides at their website CA CERTs)
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 实验室列表 (2014) 进行检查,并删除了弱密码。随意 add/remove 任何密码。
如果您仍想追求多个 CURLOPT_SSLVERSION
选项,我会编写一个脚本来执行此操作(我认为这不是一个好的做法或必要的)。但是,如果您出于任何原因决定追求该功能,请编写一些代码,尝试使用最强大的 SSL 加密,然后在连接失败时回退到下一个版本。
- 在做出决定之前,请先查看 Qualys SSL Labs 的 projects 关于安全性的内容。
- 查看 this SSL Labs' article 关于完全前向保密和最佳实践的内容。
- 使用 SSL Labs' web tool 测试您的客户端(网络浏览器)是否存在任何漏洞。这将使您了解在您的服务器和应用程序上要查看什么以及要改进和保护什么。
- 使用 Qualys 的 SSL 实验室测试您的 website/web 服务 SSL tool。
漏洞和攻击:Longjam、FREAK、POODLE,应有尽有!谁知道还有哪些其他攻击或漏洞未被发现?是的!它们都会影响您选择 SSL/TLS 连接。
您无法控制客户端(除非您开发它),但您可以控制服务器和服务器-客户端协商。
无论您构建什么应用程序,您都应该查看最佳实践,根据您的需要和具体情况,您应该决定以下选项:
- 安全
- 兼容性
- 可维护性
- 复杂性
如果安全性如此重要,请至少使用 TLS1.1。
也看看密码列表,我不会忽略那部分。
您的应用周围还有一个不错的OWASP guide for creating a secure layer。
OWASP 和 Qualys SSL Labs 是很好的入门资源。我什至会对 cURL 和 OpenSSL 进行一些研究,以熟悉弱点、可能的安全选项和最佳实践。
还有一些安全点,我没有提到也没有提到,但我们不能面面俱到。这只是冰山一角。
此处未提及的内容供您研究。
祝你好运!
如果可以的话,我会随时回答任何问题。
在 Guzzle 5.3 中,我必须使用以下语法:
$guzzle = new \GuzzleHttp\Client([
'defaults' => [
'config' => [
'curl' => [
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
]
]
]
]);
我们开始在 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 页面找到可能的 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
的 link)——“传递一个 long 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 provides at their website CA CERTs)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 实验室列表 (2014) 进行检查,并删除了弱密码。随意 add/remove 任何密码。
如果您仍想追求多个 CURLOPT_SSLVERSION
选项,我会编写一个脚本来执行此操作(我认为这不是一个好的做法或必要的)。但是,如果您出于任何原因决定追求该功能,请编写一些代码,尝试使用最强大的 SSL 加密,然后在连接失败时回退到下一个版本。
- 在做出决定之前,请先查看 Qualys SSL Labs 的 projects 关于安全性的内容。
- 查看 this SSL Labs' article 关于完全前向保密和最佳实践的内容。
- 使用 SSL Labs' web tool 测试您的客户端(网络浏览器)是否存在任何漏洞。这将使您了解在您的服务器和应用程序上要查看什么以及要改进和保护什么。
- 使用 Qualys 的 SSL 实验室测试您的 website/web 服务 SSL tool。
漏洞和攻击:Longjam、FREAK、POODLE,应有尽有!谁知道还有哪些其他攻击或漏洞未被发现?是的!它们都会影响您选择 SSL/TLS 连接。
您无法控制客户端(除非您开发它),但您可以控制服务器和服务器-客户端协商。
无论您构建什么应用程序,您都应该查看最佳实践,根据您的需要和具体情况,您应该决定以下选项:
- 安全
- 兼容性
- 可维护性
- 复杂性
如果安全性如此重要,请至少使用 TLS1.1。 也看看密码列表,我不会忽略那部分。
您的应用周围还有一个不错的OWASP guide for creating a secure layer。
OWASP 和 Qualys SSL Labs 是很好的入门资源。我什至会对 cURL 和 OpenSSL 进行一些研究,以熟悉弱点、可能的安全选项和最佳实践。
还有一些安全点,我没有提到也没有提到,但我们不能面面俱到。这只是冰山一角。 此处未提及的内容供您研究。
祝你好运!
如果可以的话,我会随时回答任何问题。
在 Guzzle 5.3 中,我必须使用以下语法:
$guzzle = new \GuzzleHttp\Client([
'defaults' => [
'config' => [
'curl' => [
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
]
]
]
]);