我刚刚将 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