PHP stream_socket_enable_crypto()为什么返回FALSE的原因?

时间:2018-11-22 20:42:22

标签: php zend-framework zend-framework3

我正在设置ZF3 SMTP邮件传输,以将邮件发送到使用PostFix和Dovecot设置的我自己的电子邮件服务器。

我不断收到'Unable to connect via TLS'尝试启用TLS时发生的stream_socket_enable_crypto()错误。

我尝试使用TLS与另一个电子邮件服务器(我的ISP的电子邮件服务器)配合使用,因此它可以工作,因此它不是我的代码本身。

由于我已经能够将Outlook连接到我的电子邮件服务器,所以我知道到smtp:587到我的服务器的连接都可以使用,并且身份验证也可以使用。

这不是身份验证问题,因为我确实在套接字上启用了启用TLS的路径。

有人对问题所在有任何建议吗?还是要检查以找出问题的清单?

编辑:

如果此附加信息有帮助,我在开发计算机上使用了自签名CA证书。确切地说,我从Apache运行PHP,该PHP使用从自签名CA生成的证书。

从后缀/提交中查看日志,我似乎收到了“未知的CA”错误。试图将我的自签名CA添加到服务器上的CA列表中,但这似乎无法解决问题。

1 个答案:

答案 0 :(得分:2)

经过几次调查,结果发现我的本地计算机上的PHP未正确设置以验证受信任的CA。我正在运行Bitnami的堆栈,并且已将PHP设置为在PHP安装目录中使用本地CA捆绑软件。这是由openssl.capath=中的php.ini指令设置的。

     openssl.capath=c:/bitnami/wampstack-5.6.34-0/php/curl-ca-bundle.crt

php.ini文件对openssl.capath具有以下注释:

     ; If openssl.cafile is not specified or if the CA file is not found, the
     ; directory pointed to by openssl.capath is searched for a suitable
     ; certificate. This value must be a correctly hashed certificate directory.
     ; Most users should not specify a value for this directive as PHP will
     ; attempt to use the OS-managed cert stores in its absence. If specified,
     ; this value may still be overridden on a per-stream basis via the "capath"
     ; SSL stream context option.

通过注释openssl.capath指令,PHP能够使用Window的证书存储区并找到与邮件服务器使用的证书关联的CA。