我有一个带有imap函数的php脚本。当我从浏览器调用php文件时,一切都很好,但是当它与cronjob一起运行时出现以下错误:
X-Powered-By: PHP/5.3.27
Set-Cookie: bgm=31dc5ff02b6a3d1614a9dd1c39321fd0; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
<br />
<b>Warning</b>: imap_open() [<a href='function.imap-open'>function.imap-open</a>]: Couldn't open stream {"hostname":993/imap/notls/ssl} in <b>/"path"/cron.php</b> on line <b>173</b><br />
<br/><br/><span style='color:red'></span><pre>Certificate failure for "hostname": unable to get local issuer certificate: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA</pre><br/><br/><br />
操作系统:CentOS 5.9 cronjob是用Cpanel创建的:/ usr / bin / php file.php。 imap_last_error()给出以下错误: &#34;主机名&#34; 的证书失败:无法获得本地颁发者证书: 但是当我从任何浏览器调用cron.php时,证书失败并没有结束,一切正常。
答案 0 :(得分:1)
OpenSSL将CA捆绑文件位置/ CA目录位置作为参数(命令行或库方法调用)或从环境变量SSL_CERT_FILE / SSL_CERT_DIR中获取。
我的猜测是在这种情况下,Apache环境中有一个设置正确,而cron环境没有。两种解决方案:
SSL_CERT_FILE="/path/to/ca-bundle.crt"
putenv('SSL_CERT_FILE=/usr/share/ssl/certs/ca-bundle.crt');
感谢@ Daniel-Roethlisberger鼓励我根据他在Ruby中的解决方案找到第二个解决方案:https://stackoverflow.com/a/14797635/2294879
我认为也必须可以在PHP使用的imap程序/库的构建中指定默认的bundle位置(因为我的imap连接在应用上述之前曾经工作正常),但这肯定更麻烦。
答案 1 :(得分:0)
似乎PHP无法验证证书。在向资源URL添加/ novalidate-cert时,您能检查它是否有效吗?