Я только что обновил свой 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).
Я также ничего не вижу в syslog или authlog сервера maiml.
EDIT: Добавить информацию:
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).
Серверы и программное обеспечение:
Сервер А: Почтовый сервер, Debian 6, Postfix, самоподписанные сертификаты
Сервер Б: 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
Даст вам цепочку сертификатов. Скопируйте вывод в (say), /etc/ssl/certs/lbutlr_local.crt
затем запуститеupdate-ca-certificates