在全部搜索之后,我无法理解为什么发布到远程启用SSL的主机的cURL请求仅在我的情况下成功的时间的50%左右。下面是这样的情况:我有一系列cURL请求,所有这些请求都发布到HTTPS远程主机,在我使用PHP CLI运行的单个PHP脚本中。偶尔当我运行脚本时,请求会成功执行,但由于某些原因我运行它的大部分时间,我从cURL得到以下错误:
* 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 :(得分:3)
远程主机可能不是真正独特的主机。也许它是某种负载平衡解决方案,有几台服务器接收传入的请求。 是什么让我觉得可能是错误信息中的'mac error'。这可能意味着远程主机mac地址在SSL否定仍在运行时已更改。这可以解释有时你没有任何问题。
但也许不是:-) SSL问题很难找到。
我不理解您对prefork MPM vs Worker MPM的回答,如果您在cli模式下运行PHP,则不使用apache MPM,您甚至不使用apache。
答案 1 :(得分:1)
您可能需要此选项:
CURLOPT_FORBID_REUSE
通过很久。设置为1以使下一次传输在完成后显式关闭连接。通常,libcurl在完成一次传输时保持所有连接都处于活动状态,以防后续的传输可以重用它们。应谨慎使用此选项,并且只有在您了解其功能时才应使用此选项。设置为0以使libcurl保持连接打开,以便以后重新使用(默认行为)。
答案 2 :(得分:0)
你试过吗? curl_setopt($ handle,CURLOPT_SSLVERSION,3);