在Guzzle中强制使用TLS 1.2

时间:2016-02-19 18:34:04

标签: php guzzle

我使用GuzzleHttp\Client与API进行通信。 API的运营商正在禁用SSL和1.2之前的TLS,并告诉我我的应用程序仍在使用早期的协议。

我怎样才能确保Guzzle只使用最新的?我不确定我的Guzzle版本是什么(我没有设置它),它在源代码中没有显示。

1 个答案:

答案 0 :(得分:2)

直到最近,我还在一家名为WePay的公司工作,该公司处理财务信息,并受到PCI-DSS变更的影响,该变更表明早期版本的TLS不再被认为是安全的,我们需要所有客户来被推到TLS 1.2。这个PCI-DSS要求最终放宽到2018年6月,但您仍应确保尽早兼容。

我的任务是进行研究,以了解我们的客户将如何受到影响(例如,PHP,Java,Ruby,C#),并记录我发现的所有内容。我在这里写的是内存,因为我不再为WePay工作或访问他们的内部Confluence页面。

Guzzle有多种传输方法,包括PHP流,以及PHP的cURL扩展。

  1. PHP Streams(例如fsockopen())无法保证TLS支持,所以实际上,您应确保PHP安装已安装PHP cURL扩展(包括基础libcurl.so库, 假设您的Web服务器是Linux)。

  2. 你的底层curl / libcurl必须是7.35.0或 newer 。面向消费者的Linux可能有更新的版本。我可以告诉你,CentOS / RHEL / OracleLinux 6.8附带cURL 7.19.0(太旧)和7.3发货7.29.0(也太旧)。我不会花很多时间在Ubuntu / Debian / SLES上,所以你需要自己调查这些选项。对于CentOS / RHEL / OracleLinux,您可以自己编译和打包cURL,也可以依赖Cityfan repo中的cURL(取决于来自EPEL的包)。

    与往常一样,永远不会盲目地信任第三方依赖。要么知道谁编译/打包代码并将它们信任为资源,要么自己编译/打包代码。

  3. 您还需要兼容的PHP版本。支持TLS 1.2的PHP的第一个版本是PHP 5.5.19和PHP 5.6.3。早于5.6.0的PHP版本是EOL,不再接收任何安全更新,因此从一个专业人员到另一个专业人员,如果您的版本低于5.6.0,我强烈强烈鼓励您升级。

  4. 一些不是PHP原生的开发人员可能会使用工作的代码,但实际上对您不利。在一个庞大的遗留代码库中,通常会看到:

    1. Old-school 流功能(例如fsockopen()fopen($remote_url))。对于HTTP(S)请求,这些通常被认为是Bad™,并且就TLS支持而言是不可靠的。

    2. 直接调用curl_*个函数。 cURL是一个非常复杂的野兽,有很多好的选择和许多糟糕的选择。作为一般规则,如果您直接在PHP中使用cURL函数,则几乎可以肯定您正在做错误。

    3. 最好的方法是使用专门的,编写良好,经过良好测试的HTTP库,例如Guzzle(或Requests或Buzz),用于100%的Web服务调用。这些库是Good™。

  5. 如果您确定:

    • 底层服务器的cURL / libcurl版本为7.35.0或更新安装...
    • 您安装了足够新版本的PHP(建议至少 5.6.3)...
    • 正在使用Guzzle进行100%的HTTP(S)端点呼叫......

    然后你状态良好。一旦服务将交换机翻转为需要TLS 1.2,您的应用程序将自动开始使用TLS 1.2。