Certificados autoassinados criam problemas no NGinx/PHP

Certificados autoassinados criam problemas no NGinx/PHP

Acabei de atualizar meu Debian 7, Nginx 1.6.2, PHP 5.4.39 para Debian 8, Nginx 1.6.2, PHP 5.6.9.
Existe um CRM rodando naquele servidor onde enviamos e-mails via PHP, EspoCRM e está usando ZendFramwork2 E-Mail (envio via servidor 2 - envio via Thunderbird funciona perfeitamente).
Isso estava funcionando bem até depois da atualização. Agora eu tenho um erro dizendo:

500 unable to connect via tls

Portanto, uma pequena pesquisa não trouxe nada ao CRM, mas sim apontou para o certificado autoassinado e/ou algo na pilha acima (NGinx/PHP?).
Alguma ideia de por onde começar a cavar? No meu servidor CRM não tenho nada nos logs de erros (acho que foi engolido pelo CRM).
Também não vejo nada no syslog ou authlog do servidor maiml.

EDITAR: Adicionar informações:
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  

Usei o arquivo de configuração antigo do Debian 7 (NGinx é a mesma versão - usei um backport no D7).

Servidores e Software:
Servidor A: Mailserver, Debian 6, Postfix, certificados autoassinados
Servidor B: Debian 8, Nginx, PHP, EspoCRM - Eu escolhi TLS porque ele está funcionando no meu Thunderbird no meu PC local e estava funcionando antes da atualização do Debian 7 para 8.
Computador local: Kubuntu, Thunderbird, Mails podem ser enviados e recebidos via TLS.

Responder1

Pelo que entendi, o PHP 5.6 não permite aceitar, validar ou processar certificados autoassinados.

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

Você tem que desabilitar a verificação de pares e nomes de pares

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

Isso não é trivial se você tentar fazer isso dentro de um pacote (que parece ser intencional), você não pode simplesmente definir alguns sinalizadores no php.ini ou qualquer coisa simples assim.

Responder2

500 não é possível conectar via tls

Isso não é muito útil para identificar onde está o problema - mas deve estar em algum lugar do código que presumivelmente você não mantém, portanto, alterar o código para fazê-lo funcionar deve ser o último recurso.

Seria útil saber qual ação desencadeia esse erro.

Como o único local em seu manifesto que menciona um certificado autoassinado é o servidor de e-mail, presumirei que é isso que está causando o problema aqui.

Tudo o que você precisa fazer é adicionar o certificado autoassinado às autoridades aceitas no host onde o aplicativo reside. Supondo (novamente) que o MTA esteja usando SMTPS:

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

Fornecerá a cadeia de certificados. Copie a saída para (digamos) /etc/ssl/certs/lbutlr_local.crte executeupdate-ca-certificates

informação relacionada