web-dev-qa-db-fra.com

PHPMailer génère PHP Avertissement: stream_socket_enable_crypto (): le certificat homologue ne correspond pas à ce qui était attendu

J'utilise PHPMailer sur PHP 5.6, la sécurité accrue autour de la certification dans PHP 5.6 est certainement amusante.

J'essaie d'envoyer un message de test à un domaine hébergé sur dreamhost. L'erreur signalée par PHPMailer est: Impossible de se connecter à l'hôte SMTP.

Cette erreur n’est pas correcte cependant, j’ai activé la journalisation et voici ce qui se passe réellement.

Connexion: ouverture sur mx1.sub4.homie.mail.dreamhost.com:25, délai d'attente = 30, options = array () Connexion: ouverte 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-ENHANCED CODE D'ETAT 250 8BITMIME

C: STARTTLS

S: 220 2.0.0 Prêt à démarrer TLS

C: QUITTER

S: ERREUR SMTP: La commande QUIT a échoué: Connexion: fermée

Je ne comprenais pas pourquoi PHPMailer abandonnait simplement en émettant une commande QUIT alors qu'il devait commencer à envoyer le message. J'ai un autre indice d'un autre journal:

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

Si j'utilise certaines options personnalisées pour empêcher la validation du certificat utilisé, je peux le faire continuer. Voici ce que j'ai

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

Si je mets les options SMTP ici et passe la vérification entre homologues, le message va bien - sans avertissement dans PHP.

Comment puis-je intercepter cette erreur, alors je sais qu’il ya un problème mais je continue à envoyer le message?

36
Rob Gunsuka

J'ai eu le même problème et j'ai trouvé la réponse dans la documentation de PHPMailer .

PHP 5.6 échec de la vérification du certificat

Dans une version antérieure aux versions précédentes, PHP 5.6 vérifie les certificats sur les connexions SSL. Si la configuration SSL du serveur auquel vous vous connectez n'est pas correcte, vous obtiendrez une erreur comme celle-ci:

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

Le correctif correct consiste à remplacer le certificat invalide, mal configuré ou auto-signé par un bon. Sinon, vous pouvez autoriser les connexions non sécurisées via la propriété SMTPOptions introduite dans PHPMailer 5.2.10 (il est possible de le faire en sous-classant la classe SMTP dans les versions antérieures), bien que cela ne soit pas recommandé:

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

Vous pouvez aussi changer ces paramètres globalement dans votre php.ini, mais c'est une très mauvaise idée. PHP 5.6 a effectué ce changement pour de très bonnes raisons.

Parfois, ce comportement n'est pas aussi évident. Parfois, des échecs de chiffrement peuvent apparaître lorsque le client émet un QUIT immédiatement après avoir tenté de faire un STARTTLS. Si cela se produit, vérifiez l'état de vos certificats ou de vos paramètres de vérification.

66
Jesús Amieiro

Pour PHP 5.6, utilisez ce qui suit. L'ajout de "tls: //" est la clé. 

$mail->Host = gethostbyname('tls://smtp.gmail.com');

Voir: http://php.net/manual/en/context.ssl.php

3
Chrisbot

Pour ceux qui utilisent cPanel, j’ai essayé le code de contrôle SMTP du dossier des exemples de PHPMailer et j’ai eu la même erreur:

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

J'ai réalisé que ce n'était pas une erreur liée à PHPMailer. J'ai donc recherché des erreurs similaires liées à CentOS et j'ai trouvé ce lien qui éclairait un peu la lumière: Envoi de mails via un tiers . Vous devez jeter un oeil à "Restrictions SMTP" dans cPanel.

1
georch

J'ai eu un problème similaire après avoir mis à niveau vers PHP 5.6 sur ma machine WordPress. Le plug-in WP Mail SMTP par WPForms (wp-mail-smtp) a été configuré pour utiliser localhost en tant qu'hôte SMTP. Je l'ai changé en FQHN (nom d'hôte complet) tel qu'il est défini dans le certificat SSL . Après ce changement, tout fonctionne correctement.

0
Sergey Vlasov