【发布时间】:2019-04-25 12:57:20
【问题描述】:
我正在设置 ZF3 SMTP 邮件传输,以将邮件发送到我自己的电子邮件服务器,该服务器是我使用 PostFix 和 Dovecot 设置的。
当stream_socket_enable_crypto() 尝试启用 TLS 时,我不断收到 'Unable to connect via TLS' 错误。
我尝试使用 TLS 与另一台电子邮件服务器(我的 ISP 的电子邮件服务器)一起使用,它工作正常,所以它不是我的代码本身。
由于我已经能够将 Outlook 连接到我的电子邮件服务器,因此我知道到我的服务器的 smtp:587 连接有效,并且身份验证也有效。
这不是身份验证问题,因为我确实在套接字上获得了启用 TLS 的路径。
有人对问题出在哪里有任何建议吗?还是要检查以找出问题的清单?
编辑:
如果这些附加信息有帮助,我将在我的开发机器上使用自签名 CA 证书。准确地说,我从 Apache 运行 PHP,它使用从自签名 CA 生成的证书。
查看来自 postfix/submission 的日志,我似乎遇到了“未知 CA”错误。试图将我的自签名 CA 添加到我服务器上的 CA 列表中,但这似乎无法解决问题。
【问题讨论】:
-
来自文档:“成功时返回 TRUE,协商失败时返回 FALSE,如果数据不足,则返回 0,您应该重试(仅适用于非阻塞套接字)。”因此,如果它实际上返回 false,则可能是您的服务器支持的方法与 PHP 支持的方法不匹配。
-
stream_socket_enable_crypto() 返回 false。到目前为止,我认为启用加密时套接字使用的证书被远程拒绝。就像我提到的,我在运行 PHP 脚本的开发机器上使用由自签名 CA 生成的证书。使用 Apache 上的虚拟主机运行 PHP 脚本,虚拟主机使用该开发证书。如何确定我的脚本正在使用哪个证书?与虚拟主机相关联的那个?或者它是另一个默认证书?
-
你的web服务器使用的证书与PHP如何连接其他服务器无关。如果您的邮件服务器使用的是自签名证书,您需要使用
stream_socket_context_create()设置选项以确保 PHP 识别该证书。 -
邮件服务器正在使用 GoDaddy 颁发的有效证书。我运行 PHP 代码的服务器使用自签名 CA(我为开发目的创建)颁发的证书。对 SSL/TLS 不是很精通,所以我不确定哪一方拒绝开始加密,并且邮件服务器(Postfix/Dovecot)上的日志非常神秘。
-
您的网络服务器使用的证书用于与网络浏览器通信,而不是建立网络连接。如果您的邮件服务器证书已经被信任,我会回到我原来关于加密算法不匹配的陈述。
标签: php zend-framework zend-framework3