自签名证书给 NGinx/PHP 带来问题

自签名证书给 NGinx/PHP 带来问题

我刚刚将 Debian 7、Nginx 1.6.2、PHP 5.4.39 升级到 Debian 8、Nginx 1.6.2、PHP 5.6.9。
该服务器上运行着一个 CRM,我们过去通过 PHP、EspoCRM 发送电子邮件,它使用 ZendFramwork2 E-Mail(通过服务器 2 发送 - 通过 Thunderbird 发送效果很好)。
升级之前,它一直运行良好。现在我收到一条错误消息:

500 unable to connect via tls

因此,搜索了一下,CRM 没有找到任何内容,而是指向自签名证书和/或上面堆栈中的某些内容(NGinx/PHP?)。
知道从哪里开始挖掘吗?在我的 CRM 服务器中,错误日志中没有任何内容(猜测是被 CRM 吞没了)。
我在 maill 服务器的 syslog 或 authlog 中也看不到任何内容。

编辑:添加信息:
phpinfo ()

Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, tls, tlsv1.0, tlsv1.1, tlsv1.2
curl   
SSL     Yes
SSL Version     OpenSSL/1.0.1k  
imap 
SSL Support     enabled  
openssl
OpenSSL support     enabled OpenSSL  
Library Version     OpenSSL 1.0.1k 8 Jan 2015 OpenSSL Header Version  
OpenSSL 1.0.1k 8 Jan 2015  Directive    Local Value Master Value  
openssl.cafile  no value    no value openssl.capath no value    no value     
Phar  
OpenSSL support     enabled  

我使用了 Debian 7 的旧配置文件(NGinx 是相同版本 - 我在 D7 上使用了反向移植)。

服务器和软件:
服务器 A:邮件服务器、Debian 6、Postfix、自签名证书
服务器 B:Debian 8、Nginx、PHP、EspoCRM - 我选择 TLS,因为它在我本地电脑上的 Thunderbird 中运行,并且在 Debian 7 到 8 升级之前就可以运行。
本地电脑:Kubuntu、Thunderbird、邮件可以通过 TLS 发送和接收。

答案1

据我了解,PHP 5.6 不允许接受验证或处理自签名证书。

http://php.net/manual/en/migration56.openssl.php

您必须禁用对等方和对等方名称的验证

$streamContext = stream_context_create([
            'ssl' => [
                'verify_peer'      => false,
                'verify_peer_name' => false
            ]
        ]);

如果尝试在包中执行此操作(这似乎是设计使然),这并非易事,您不能仅在 php.ini 中设置一些标志或类似的任何简单操作。

答案2

500 无法通过 tls 连接

这对于确定问题出在哪里没有多大帮助 - 但它一定出在代码中的某个地方,大概是你不维护的,因此修改代码使其工作应该是最后的手段。

了解什么操作会触发此错误很有用。

由于清单中唯一提到自签名证书的地方是邮件服务器,因此我会假设这就是导致此问题的原因。

您需要做的就是将自签名证书添加到应用程序所在主机的接受机构。假设(再次)MTA 使用 SMTPS:

openssl s_client -showcerts -connect servera.example.com:465 </dev/null

将为您提供证书链。将输出复制到(例如)/etc/ssl/certs/lbutlr_local.crt然后运行update-ca-certificates

相关内容