2010-12-21 86 views
5

全部搜索后,我不明白为什么向远程启用SSL的主机发出的cURL请求在我的情况下只有50%左右的时间成功。情况如下:我使用PHP CLI运行的单个PHP脚本中有一系列cURL请求,它们全部发给HTTPS远程主机。偶尔当我运行的请求成功执行,但由于某些原因大多数时候我运行的脚本,我从卷曲以下错误:cURL/PHP请求执行50%的时间

* About to connect() to www.virginia.edu port 443 (#0) 
* Trying 128.143.22.36... * connected 
* Connected to www.virginia.edu (128.143.22.36) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac 
* Closing connection #0 

如果我再试了几次,我得到了相同的结果,但在几次尝试后,请求将成功完成。之后再次运行脚本会导致错误,并且该模式会继续。研究错误'alert bad record mac'并没有给我带来任何帮助,而且我仍然毫不犹豫地将它归咎于SSL问题,因为脚本仍然偶尔运行。

我在Ubuntu Server 10.04上安装了php5和php5-curl,以及最新版本的openssl。根据cURL特定选项,CURLOPT_SSL_VERIFYPEER设置为false,并且CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT都设置为4秒。进一步说明这个问题的事实是,在我的Mac OS X开发机器上出现同样的情况 - 请求只经历了大约50%的时间。

+0

您可能想Google“错误140943FC” – 2010-12-21 07:10:46

+0

相信我,我做到了。我甚至检查过,以确保我在prefork MPM中运行Apache,而不是工作线程,因为显然有一个与工作线程版本相关的错误(我正在运行prefork,所以它没有帮助)。 – mquinn 2010-12-21 10:57:40

+2

错误记录MAC不引用网络接口的MAC地址。它指的是“消息认证码” – 2012-12-18 03:26:13

回答

3

远程主机可能不是真正的唯一主机。也许这是某种负载平衡解决方案,其中有几台服务器接收传入的请求。 是什么让我觉得它可能是错误消息中的'mac error'。这可能意味着远程主机mac地址在SSL重协同运行时发生了改变。这可以解释,有时你没有任何问题。

但也许不是:-) SSL问题很难找到。

我不明白你对prefork MPM vs Worker MPM的回答,如果你在cli模式下运行PHP你的apache MPM没有使用,你甚至不使用Apache。

+0

的一个问题,负载均衡的远程主机在我的情况下会有意义。为了解决这个问题,我决定阻止,直到我可以得到一个有效的,非错误的卷曲响应并从那里开始。最好的我现在得到了。 – mquinn 2010-12-23 06:59:57

+3

我不认为MAC与网络MAC地址有任何关系。它代表消息认证代码:http://en.wikipedia.org/wiki/Message_authentication_code ...这使我得出结论:“远程主机MAC地址”的变化与此问题无关,反之亦然。 – 2013-10-04 12:05:35

+0

@Charles Oliver Nutter很好的捕获,但这可能仍然是一个问题,应该在主机之间共享(ssl缓存?),而不是。 – regilero 2013-10-04 14:59:21

1

您可能需要此选项:

CURLOPT_FORBID_REUSE

传递一个长。设置为1以使下一次传输在完成时显式关闭连接。通常情况下,libcurl在一次传输完成后保留所有连接,以防随后的传输可以重新使用它们。这个选项应该谨慎使用,只有当你明白它的作用时。设置为0以使libcurl保持连接打开以供将来重新使用(默认行为)。

+0

感谢您的建议,但它是无济于事。我以前曾尝试过CURLOPT_FRESH_CONNECT,但这并不奏效,并且FORBID_REUSE导致了相同的旧行为。 – mquinn 2010-12-23 06:44:07

0

你试过了吗? curl_setopt($ handle,CURLOPT_SSLVERSION,3);