php ssl openssl phpmailer

PHPMailer genera advertencia de PHP: stream_socket_enable_crypto(): el certificado de igual no coincide con el esperado



ssl openssl (5)

Estoy usando PHPMailer en PHP 5.6, la seguridad aumentada alrededor de certificada en PHP 5.6 es ciertamente divertida.

Estoy tratando de enviar un mensaje de prueba a un dominio alojado en Dreamhost, el error que vuelve de PHPMailer es: No se pudo conectar al host SMTP.

Sin embargo, ese error no es correcto, tengo el registro habilitado y esto es lo que realmente está sucediendo.

Conexión: apertura a mx1.sub4.homie.mail.dreamhost.com:25, timeout = 30, options = array () Conexión: abierta S: 220 homiemail-mx32.g.dreamhost.com ESMTP

C: EHLO s81a.ikbb.com

S: 250-homiemail-mx32.g.dreamhost.com 250-PIPELINING 250-SIZE 40960000 250-ETRN 250-STARTTLS 250-ESHANCEDSTATCOCODES 250 8BITMIME

C: STARTTLS

S: 220 2.0.0 Listo para comenzar TLS

C: SALIR

S: SMTP ERROR: el comando QUIT falló: Conexión: cerrada

No podía entender por qué PHPMailer simplemente se da por vencido, emitiendo un comando QUIT cuando debería comenzar a enviar el mensaje. Tengo otra pista de otro registro:

Advertencia de PHP: stream_socket_enable_crypto (): el certificado de *.mail.dreamhost.com'' did not match expected CN= CN = *.mail.dreamhost.com'' did not match expected CN= mx1.sub4.homie.mail.dreamhost.com'' en /home/ikbb/domains/dev.ikbb.com /public_html/includes/phpmailer/5.2.10/class.smtp.php

Si uso algunas opciones personalizadas para evitar la validación del certificado que están utilizando, puedo lograr que continúe. Esto es lo que tengo:

$mail->SMTPOptions = array ( ''ssl'' => array( ''verify_peer'' => false, ''verify_peer_name'' => false, ''allow_self_signed'' => true));

Si pongo SMTPOptions allí y omito la verificación entre iguales, el mensaje va bien, sin advertencia en PHP.

¿Cómo puedo atrapar ese error, entonces sé que hay un problema pero todavía enviar el mensaje?



Para aquellos de ustedes que usan cPanel, probé el código de verificación SMTP de la carpeta de ejemplos en PHPMailer y obtuve este mismo error:

PHP Warning: stream_socket_enable_crypto(): Peer certificate CN=*.mail.dreamhost.com'' did not match expected CN=mx1.sub4.homie.mail.dreamhost.com'' in /home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer/5.2.10/class.smtp.php

Me di cuenta de que no era un error relacionado con PHPMailer, por lo que busqué errores similares relacionados con CentOS y encontré este enlace que arrojó algo de luz: Emitir el envío de correos a través de terceros . Tienes que echar un vistazo a "Restricciones de SMTP" en cPanel.


Probablemente ya hayas resuelto tu problema. Pero dado que otros desarrolladores pueden ser tocados en esto, propondré algo que funcionó para mí. Tuve el mismo problema con Laravel 4.2 Swiftmailer en lugar de PHPMailer, pero con una cuenta de Dreamhost VPS. No quería piratear las opciones de SMTP verify_peer, allow_self_signed o establecer el cifrado de ssl a null. No quería comprar un certificado profesional para mi VPS provisional, y todavía no estoy en producción.

Lo que probé no funcionó en mail.php:

<?php return array( ''driver'' => ''smtp'', ''host'' => ''mail.mywebsite-staging.com'', ''port'' => 25, ''from'' => array(''address'' => ''[email protected]'', ''name'' => ''MyWebsite Staging''), ''encryption'' => ''tls'', ''username'' => ''[email protected]'', ''password'' => ''myPASS'', ''sendmail'' => ''/usr/sbin/sendmail -bs'', ''pretend'' => false ); ?>

Encontré esta documentación del Error de coincidencia de dominio del certificado de Dreamhost que nos dice que nuestro certificado de servidor de correo renuncia desde un subdominio (2 subnivel) de Dreamhost Mail (* .mail.dreamhost.com) donde * es un grupo que contiene varias cuentas de correo .

Tienes que ir a:

  • Dreamhost Web Panel> Soporte> Centros de datos

y verá a qué grupo pertenece su servidor de correo, para que sepa qué host usar en mail.php.

  • homiemail-sub3 => sub3.mail.dreamhost.com
  • homiemail-sub4 => sub4.mail.dreamhost.com
  • homiemail-sub5 => sub5.mail.dreamhost.com
  • homiemail-master => homie.mail.dreamhost.com

El mío era homiemail-sub4, luego usé ''host'' => ''sub4.mail.dreamhost.com'',

Entonces no hay problema de certificado. Si usa el Servidor de Correo de otro Proveedor, intente comprobar que se use comodín también para su certificado de correo.


Tuve el mismo problema y encontré la respuesta en la documentación de PHPMailer .

Fallo de verificación de certificado de PHP 5.6

En un cambio de versiones anteriores, PHP 5.6 verifica los certificados en las conexiones SSL. Si la configuración de SSL del servidor al que se está conectando no es correcta, obtendrá un error como este:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

La solución correcta para esto es reemplazar el certificado no válido, mal configurado o autofirmado por uno bueno. De lo contrario, puede permitir conexiones inseguras a través de la propiedad SMTPOptions introducida en PHPMailer 5.2.10 (esto es posible haciendo una subclase de la clase SMTP en versiones anteriores), aunque esto no se recomienda:

$mail->SMTPOptions = array( ''ssl'' => array( ''verify_peer'' => false, ''verify_peer_name'' => false, ''allow_self_signed'' => true ) );

También puede cambiar estas configuraciones globalmente en su php.ini, pero esa es una muy mala idea; PHP 5.6 hizo este cambio por muy buenas razones.

Algunas veces este comportamiento no es tan aparente; a veces, las fallas de encriptación pueden aparecer cuando el cliente emite un QUIT inmediatamente después de intentar hacer un STARTTLS. Si ve que eso ocurre, debe verificar el estado de sus certificados o la configuración de verificación.


Tuve un problema similar después de haber actualizado a PHP 5.6 en mi máquina de WordPress. El complemento WP Mail SMTP by WPForms (wp-mail-smtp) se configuró para usar localhost como host SMTP. Lo cambié al FQHN (nombre de host totalmente calificado) tal como se define en el certificado SSL. Después de este cambio, funciona bien.