Los certificados autofirmados crean problemas en NGinx/PHP

Los certificados autofirmados crean problemas en NGinx/PHP

Acabo de actualizar mi Debian 7, Nginx 1.6.2, PHP 5.4.39 a Debian 8, Nginx 1.6.2, PHP 5.6.9.
Hay un CRM ejecutándose en ese servidor donde solíamos enviar correos electrónicos a través de PHP, EspoCRM y que utiliza ZendFramwork2 E-Mail (enviar a través del servidor 2; enviar a través de Thunderbird funciona bien).
Eso funcionó bien hasta después de la actualización. Ahora tengo un error que dice:

500 unable to connect via tls

Entonces, una pequeña búsqueda no arrojó nada con el CRM, sino que apunta al certificado autofirmado y/o algo en la pila de arriba (¿NGinx/PHP?).
¿Alguna idea de por dónde empezar a cavar? En mi servidor CRM no tengo nada en los registros de errores (supongo que el CRM lo traga).
Tampoco veo nada en el syslog o authlog del servidor maiml.

EDITAR: Agregar información:
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  

Utilicé el antiguo archivo de configuración de Debian 7 (NGinx es la misma versión; utilicé un backport en D7).

Servidores y Software:
Servidor A: Servidor de correo, Debian 6, Postfix, certificados autofirmados
Servidor B: Debian 8, Nginx, PHP, EspoCRM: elegí TLS porque funciona en Thunderbird en mi PC local y funcionaba antes de la actualización de Debian 7 a 8.
PC local: Kubuntu, Thunderbird, Mails se pueden enviar y recibir a través de TLS.

Respuesta1

Según tengo entendido, PHP 5.6 no permite aceptar, validar o procesar certificados autofirmados.

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

Tienes que deshabilitar la verificación de pares y nombres de pares.

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

Esto no es trivial si intentas hacerlo dentro de un paquete (que parece ser por diseño), no puedes simplemente configurar algunas banderas en php.ini ni nada simple por el estilo.

Respuesta2

500 no pueden conectarse a través de tls

Esto no es muy útil para identificar dónde está el problema, pero debe estar en algún lugar del código que presumiblemente no se mantiene, por lo que modificar el código para que funcione debería ser el último recurso.

Sería útil saber qué acción desencadena este error.

Dado que el único lugar en su manifiesto que menciona un certificado autofirmado es el servidor de correo, asumiré que eso es lo que está causando el problema aquí.

Todo lo que necesita hacer es agregar el certificado autofirmado a las autoridades aceptadas en el host donde reside la aplicación. Suponiendo (nuevamente) que el MTA está utilizando SMTPS:

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

Le dará la cadena del certificado. Copie la salida en (digamos) /etc/ssl/certs/lbutlr_local.crty luego ejecuteupdate-ca-certificates

información relacionada