【问题标题】:php imap functions with cronjob带有cronjob的php imap函数
【发布时间】:2015-08-31 19:47:18
【问题描述】:

我有一个带有 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() 给出以下错误:“主机名”的证书失败:无法获得本地颁发者证书: 但是当我从任何浏览器调用 cron.php 时,证书失败并没有出现,一切正常。

【问题讨论】:

  • 似乎查看 file.php 并查看命令是什么,因为它在调用时期待不同的东西。错误要求建立连接,但没有连接。
  • 所以这个问题的主题不应该是“php imap functions with cronjob”,而是“How to configure a set of supported CAs with PHP's IMAP functions”。

标签: php apache cron imap


【解决方案1】:

OpenSSL 将 CA 包文件位置/CA 目录位置作为参数(命令行或库方法调用)或来自环境变量 SSL_CERT_FILE / SSL_CERT_DIR。

我的猜测是,在这种情况下,Apache 环境正确设置了其中一个,而 cron 环境没有。两种解决方案:

  1. 在 crontab 顶部设置以下环境变量之一:

SSL_CERT_FILE="/path/to/ca-bundle.crt"

  1. 在打开 imap 连接之前在 php 脚本中设置 env 变量:

putenv('SSL_CERT_FILE=/usr/share/ssl/certs/ca-bundle.crt');

感谢@Daniel-Roethlisberger 启发我根据他在 Ruby 中的解决方案找到第二个解决方案:https://stackoverflow.com/a/14797635/2294879

我认为还必须可以在 PHP 使用的 imap 程序/库的构建中指定默认捆绑位置(因为我的 imap 连接在应用上述内容之前可以正常工作),但这肯定更麻烦。

【讨论】:

    【解决方案2】:

    似乎 PHP 无法验证证书。能否在资源 URL 中添加 /novalidate-cert 时检查它是否有效?

    【讨论】:

    • with /novalidate-cert 工作正常,但这不是一个好的解决方案,因为 中间人 攻击
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2013-01-17
    • 2018-09-13
    • 2013-04-08
    相关资源
    最近更新 更多