PHPMailer génère un avertissement PHP: stream socket enable crypto (): le certificat Peer ne correspond pas à ce qui est attendu

J'utilise PHPMailer sur PHP 5.6, l'augmentation de la sécurité autour de certifié en PHP 5.6 est certainement amusant.

j'essaie d'envoyer un message de test à un domaine hébergé sur dreamhost, l'erreur qui revient de PHPMailer est: ne pouvait pas se connecter à l'hôte SMTP.

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

<!-Connexion: ouverture sur mx1.sub4.homie.courrier.dreamhost.com: 25, temps mort=30, options=array () connexion: opened s: 220 homiemail-mx32.g.dreamhost.com ESMTP

C: EHLO s81a.ikbb.com

S: 250-HOMIEMAIL-MX32.G.DREAMHOST.COM 250-PIPELINAGE 250-SIZE 40960000 250-ETRN 250-STARTTL 250-ENHANCEDSTATUSCODES 250 8BITMIME

C: STARTTLS

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

C: QUIT

S: Erreur SMTP: échec de la commande QUIT: connexion: fermé

Je ne pouvais pas comprendre pourquoi PHPMailer abandonne, en émettant une commande QUIT quand il devrait commencer à envoyer le message. J'ai eu une autre idée à partir d'un autre journal:

<!-Attention: 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

si j'utilise quelques options personnalisées pour empêcher la validation du cert ils utilisent I pouvez l'obtenir pour 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 SMT là - dedans et que je passe la vérification par les pairs, le message va bien-sans aucun avertissement dans PHP du tout.

Comment intercepter cette erreur, donc je sais qu'il y a un problème, mais encore envoyer le message?

34
demandé sur Rob Gunsuka 2015-05-21 14:05:35

5 réponses

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

PHP 5.6 échec de la vérification du certificat

dans un changement par rapport aux versions précédentes, PHP 5.6 vérifie les certificats sur les connexions SSL. Si la configuration SSL du serveur sur lequel 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

la correction correcte est de remplacer le non valide, mal configuré ou auto-signé certificat avec un bon. A défaut, 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 précédentes), 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 également modifier ces paramètres globalement dans votre php.ini, mais c'est une très mauvaise idée; PHP 5.6 fait ce changement pour de très bonnes raisons.

Parfois, ce comportement n'est pas si évident; parfois des échecs de cryptage peuvent apparaître comme le client émettant un arrêt immédiatement après avoir essayé de faire un STARTTLS. Si vous voyez que, vous devriez vérifier l'état de vos certificats ou des paramètres de vérification.

59
répondu Jesús Amieiro 2015-08-17 09:42:39

pour PHP 5.6 utilisez ce qui suit. Ajouter "tls: / /" est la clé.

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

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

3
répondu Chrisbot 2016-07-23 02:42:34

pour ceux qui utilisent cPanel, j'ai essayé le Code de vérification SMTP dans le dossier exemples dans PHPMailer et j'ai eu ce même message d'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, donc j'ai cherché des erreurs similaires liées à CentOS et j'ai trouvé ce lien qui apporte un peu de lumière: Problème lors de l'envoi de mails par le biais de la 3e partie. Vous devez jeter un oeil aux "Restrictions SMTP" dans cPanel.

0
répondu georch 2018-04-18 16:41:29

j'ai eu un problème similaire après avoir mis à jour en PHP 5.6 sur ma machine WordPress. Le plugin WP Mail SMTP by WPForms (wp-mail-smtp) a été configuré pour utiliser localhost comme hôte SMTP. Je l'ai changé en Fqhn (nom D'hôte entièrement qualifié) tel qu'il est défini dans le certificat SSL. Après ce changement, il fonctionne très bien.

0
répondu Sergey Vlasov 2018-04-23 02:28:39

vous pourriez probablement déjà résoudre votre problème. Mais comme d'autres développeurs pourraient être coincés là-dessus, je vais proposer quelque chose qui a fonctionné pour moi. J'ai eu le même problème avec Laravel 4.2 Swiftmailer au lieu de PHPMailer, mais avec un compte VPS Dreamhost. Je ne voulais pas hacker les options SMTP verify_peer, allow_self_signed ou définir le cryptage de ssl à null. Je ne voulais pas non plus acheter un certificat pro pour mon VPS de mise en scène, et je ne suis pas encore en Production.

ce que j'ai essayé qui n'a pas fonctionné à partir de la messagerie.php:

<?php
return array(

'driver' => 'smtp',

'host' => 'mail.mywebsite-staging.com',

'port' => 25,

'from' => array('address' => 'mywebsite@mywebsite-staging.com', 'name' => 'MyWebsite Staging'),

'encryption' => 'tls',

'username' => 'mywebsite@mywebsite-staging.com',

'password' => 'myPASS',

'sendmail' => '/usr/sbin/sendmail -bs',

'pretend' => false
);
?>

j'ai trouvé ce Dreamhost Erreur D'Inadéquation De Domaine De Certificat documentation qui nous dit que notre certificat de serveur de messagerie démissionne d'un sous-domaine (2 sous-niveau) de Dreamhost mail (*.mail.dreamhost.com) où * est un groupe qui contient plusieurs comptes de messagerie.

Vous devez aller à:

  • Dreamhost Web Panneau De > Support > Les Centres De Données D'

et vous verrez quel groupe votre le serveur de courrier appartient à, donc vous saurez quel hôte utiliser dans le courrier.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

Le mien était homiemail-sub4, puis j'ai utilisé "host" => "sub4.mail.dreamhost.com',

Alors pas de problème de certificat. Si vous utilisez Mail Server depuis un autre fournisseur ensuite essayer de vérifier le wild est aussi utilisé pour votre certificat mail.

-2
répondu Keitel Jovin 2015-12-12 22:02:44