web-dev-qa-db-fra.com

PHPMailer - SSL3_GET_SERVER_CERTIFICATE: la vérification du certificat a échoué

Vous avez rencontré un problème où le courrier électronique doit être envoyé à partir d'un serveur de messagerie avec un certificat auto-signé, l'erreur que je reçois est:

PHP 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 in class.smtp.php on line 327.

Quelqu'un at-il rencontré quelque chose de similaire?

MODIFIER:

J'ai également essayé de définir les paramètres stream_context (paramètres: Options de contexte SSL ):

$options['ssl']['verify_peer'] = false;
$options['ssl']['verify_peer_name'] = false;
$options['ssl']['allow_self_signed'] = true;

Pas de chance, il échoue toujours avec la même erreur que celle indiquée ci-dessus.

Merci.

25
gor181

PHP 5.6 introduit la vérification de certificat SSL, donc si votre configuration est cassée, elle échouera avec cette erreur. Vous devriez corriger votre SSL, mais vous pouvez revenir à l'ancien comportement en définissant la propriété SMTPOptions pour ne pas vérifier les certificats:

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

La modification de la bibliothèque détruit tout le sens des bibliothèques - et si vous procédez comme le suggère la réponse de Kaf, votre code se cassera lorsque vous effectuerez une mise à niveau. Vraiment, ne fais pas ça.

Note de l'éditeur: la désactivation de la vérification SSL a des implications en matière de sécurité. Sans vérification de l'authenticité des connexions SSL/HTTPS, un attaquant malveillant peut emprunter l'identité d'un point de terminaison approuvé (tel que GitHub ou un autre hôte Git distant), et vous serez donc vulnérable à un Homme au milieu Attaque . Assurez-vous de bien comprendre les problèmes de sécurité avant de vous en servir comme solution.

84
Synchro

J'ai le même problème. J'ai donc changé le fichier class.smtp.php à la ligne 238:

public function connect($Host, $port = null, $timeout = 30, $options = array()) {
       if (count($options) == 0) {
           $options['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true);
       }

maintenant cela fonctionne bien!

Note de l'éditeur: la désactivation de la vérification SSL a des implications en matière de sécurité. Sans vérification de l'authenticité des connexions SSL/HTTPS, un attaquant malveillant peut emprunter l'identité d'un point de terminaison approuvé (tel que GitHub ou un autre hôte Git distant), et vous serez donc vulnérable à un Homme au milieu Attaque . Assurez-vous de bien comprendre les problèmes de sécurité avant de vous en servir comme solution.

20
Kaf

J'ai eu le même problème. Il s'est avéré que ma configuration Postfix manquait des paramètres intermédiaires et de certificats racine:

smtpd_tls_CAfile=/etc/ssl/certs/intermediate-root-bundle.crt

Même si cette configuration Postfix fonctionnait depuis des années avec Outlook et Thunderbird, PHP était plus difficile et a échoué la vérification SSL.

Donc, même si vous êtes tenté de pirater PHPMailer, veuillez ne pas le faire, et corrigez le problème sous-jacent.

2
SurfMan