Twilio PHP - SSL证书:证书链中的自签名证书

25

当尝试使用Twilio的PHP库发送消息时,我遇到了这个错误:

Fatal error: Uncaught exception Services_Twilio_TinyHttpException with message SSL certificate problem: self signed certificate in certificate chain thrown in F:\path\to\site\twilio-php\Services\Twilio\TinyHttp.php on line 119

我正在使用Windows 7上的WAMP。

当然,我已经找到了所有其他关于证书错误的帖子。从我所能看到的情况来看,通常更新或添加cacert.pem文件可以解决问题。但是,即使这样做,我仍然会遇到相同的错误。

作为一个理智检查,在此说明我所做的事情:

  1. 从这里下载了最新的证书:http://curl.haxx.se/ca/cacert.pem
  2. 将此文件放置在以下位置:c:/wamp/certs/cacert.pem
  3. 将php.ini更新如下:curl.cainfo = c:/wamp/certs/cacert.pem
  4. 重新启动了包括Apache在内的所有WAMP服务

但我仍然会遇到相同的错误。我已经通过phpinfo()验证我正在编辑正确的php.ini。我无法理解它为什么还要抱怨。

是否有任何方法可以100%验证我的cacert.pem文件是否被找到和读取? 我已经检查了phpinfo(),并没有提及它。 它应该在哪里声明它正在使用哪个(如果有)cacert.pem文件吗?

谢谢!


我和你现在的情况一样。我已经在我的php.ini文件中配置了cacert.pem,并通过echo ini_get('curl.cainfo')确认它被正确加载。但是Twilio还是不与我的WAMP安装进行通信。你在这方面有进展吗? - hbit
1
最终我不得不使用curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);。我知道这是一种不太好的方法,但我只在开发中使用它。我的生产服务器正在使用SSL而没有任何问题。 - jd182
感谢您的反馈。实际上我也遇到了同样的问题 - 我无法在Windows / WAMP上解决这个问题。但在我的Linux生产环境中,启用证书检查后一切正常运行。 - hbit
9个回答

56

我遇到了完全相同的问题。

按照以下步骤操作:

下载以下文件 - cacert.pem

然后下载以下文件 - thawte_Premium_Server_CA.pem

在文本编辑器中打开第二个文件,并将其内容复制到第一个文件 (cacert.pem 文件的底部/末尾)。

保存cacert.pem并将以下行添加到您的php.ini文件中:

[curl]
curl.cainfo=c:/xampp/php/cacert.pem

很明显,将目录更改为您的pem所在位置。 重新启动php本地服务器(xampp / wamp)。 然后它就可以无缝运行了。

谢谢。


9

编辑TinyHttp.php文件

在$opts数组中添加CURLOPT_SSL_VERIFYPEER => FALSE,,以解决与SSL证书相关的问题。


4
这意味着“不检查证书”,会削弱证书提供的中间人攻击保护。我认为这并不能解决问题。 - halfer
1
@halfer,如果你有更好的解决方案,请告诉我。 - Nuno Ferro
1
这个页面上还有其他解决方案,快速浏览下来,似乎是将cURL指向正确的证书。 - halfer
2
对我有用,我在Http / CurlClient.php的第108行进行了编辑,并添加了CURLOPT_SSL_VERIFYPEER => FALSE。我不想添加证书,因为如果服务器上缺少证书,则必须编辑php.ini以指向该证书,这有时会根据托管变得复杂。 - shivgre

4

不要修改tiny_http.php,您可以通过使用Twilio的CurlClient构造函数调用自己选择的选项来添加自己的cURL选项,例如:

    $client = new \Twilio\Rest\Client($accountSid, $authToken);
    $curlOptions = [ CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false];
    $client->setHttpClient(new CurlClient($curlOptions));

    try {
        $call = $client->calls->create($from_phone, $phone_number, $callback_url);
        print 'Call queued with Twilio';
    } catch (\Exception $ex) {
        print 'Twilio error: ' . $ex->getMessage();
    }

这对我有用,其他任何方法都没有起作用。 - Isuru

3

我没有使用Twilio,但我在Windows上遇到了与OP描述的完全相同的问题。我通过从此页面下载ca-bundle.crt文件并将我的php.ini指向它来解决了这个问题: http://curl.haxx.se/docs/caextract.html


请粘贴在php.ini中所需的代码行及其相应的ini部分。 - Jonathan

1
在我的情况下,上面下载链接中的cacert.pem对我没有用,但是之前twilio php库包(例如3.12.5)中的cacert.pem可用。我修改了较新包中的twilio.php文件,添加了以下两行。
CURLOPT_CAINFO => dirname(FILE) . '/cacert.pem'
'cafile' => dirname(FILE) . '/cacert.pem'

将旧包中的内容复制到相应位置,并将cacert.pem文件也复制到新包中。

之前的包裹链接在哪里? - Nathan Tuggy
我在更新的软件包中修改了twilio.php文件,添加了以下两行代码:CURLOPT_CAINFO => dirname(FILE) . '/cacert.pem' 和 'cafile' => dirname(FILE) . '/cacert.pem',并将其放置在与旧软件包相应的位置。同时,我也将cacert.pem文件复制到了更新的软件包中。 - leshan
注释往往无法清晰地表达代码,而且通常是暂时的,因此虽然我已经更新了答案以匹配,但可能会有一些小问题,请务必仔细检查答案是否合理。 - Nathan Tuggy

0

0

以下是Twilio官方的答复:

为了尝试解决这个问题,请尝试执行以下步骤:

1 下载以下pem文件:https://twilio.zendesk.com/attachments/token/EenviU5Rv4KHUzGM6VP5UijB0/?name=cacert.pem

2 将此文件复制到Windows的c:\cert\cacert.pem或Unix/Linux/Mac安装中的任何其他路径

3 在您喜欢的编辑器中打开php.ini文件

如果您的php.ini中存在以下配置string: curl.cainfo,请通过删除";"取消注释并修改路径,以便将其指向附加到此电子邮件的cacert.pem文件,例如:

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

curl.cainfo=c:\cert\cacert.pem

5 请重新启动您的Apache服务以应用更改(非常重要!)


0

对我来说,这里发布的所有答案都没有起作用。

但是当我将PHP升级到7.0.1*时,我不再遇到这个错误:Services_Twilio_TinyHttpException: SSL证书问题,请验证CA证书是否正确。详情:error:14090086:SSL

*(C:\wamp\bin\php\php-7.0.1-Win32-VC14-x64而不是C:\wamp\bin\php\php5.4.3)

而且我的C:\wamp\bin\php\php-7.0.1-Win32-VC14-x64\php.ini已经包含了curl.cainfo=C:/wamp/cacert.pem


-1

我认为如果你阅读jd182试过的内容以及他所要求的内容,他已经考虑了这些问题。 - hbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接