【问题标题】:Reasons why PHP stream_socket_enable_crypto() returns FALSE?PHP stream_socket_enable_crypto() 返回 FALSE 的原因?
【发布时间】: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


【解决方案1】:

经过多次调查,我发现我本地机器上的 PHP 没有正确设置来验证受信任的 CA。我正在运行 Bitnami 的堆栈,并且 PHP 被设置为使用 PHP 安装目录中的本地 CA 包。这是由php.ini 中的openssl.capath= 指令设置的。

     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。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2019-12-21
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多