web-dev-qa-db-fra.com

comment réparer l'échec de vérification du certificat SSL

J'utilise PHPMailer, avec Apache et PHP, localement. Lorsque je teste ma configuration SSL et mes cacerts, je reçois

default_cert_file = C:\Program Files\Common Files\SSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:\Program Files\Common Files\SSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:\Program Files\Common Files\SSL/private
default_default_cert_area = C:\Program Files\Common Files\SSL
ini_cafile = 
ini_capath = 

et puis je fais

 var_dump(fsockopen("smtp.gmail.com", 465, $errno, $errstr, 3.0));
 var_dump($errno);
 var_dump($errstr);

et je reçois

fsockopen resource(2) of type (stream) int(0) string(0) "" 

Dans mon php.ini J'ai curl.cainfo = C:/php/cacert.pem dans la partie curl et ça marche.

Mais quand j'essaie d'utiliser PHPMailer pour envoyer un mail depuis localhost, je reçois

SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed 
Failed to enable crypto
unable to connect to ssl://smtp.gmail.com:465 (Unknown error)

Je suis également allé sur le compte utilisé dans le SMTP, dans https://accounts.google.com/DisplayUnlockCaptcha et l'activer. Et à https://myaccount.google.com/lesssecureapps?pli=1 et activé les applications moins sécurisées. Je suppose que c'est une erreur SSL et non un PHPMailer. Franchement, je ne sais pas comment y remédier. Excusez mon ignorance, toute aide sur ce qui ne va pas et comment y remédier serait formidable.

PS, c'est mon fichier php qui envoie le courrier. Je vous remercie

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;    
require 'C:/php/PHPMailer/src/Exception.php';
require 'C:/php/PHPMailer/src/PHPMailer.php';
require 'C:/php/PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);                             
try {

    $mail->SMTPDebug = 3;
    $mail->isSMTP();                                      
    $mail->Host = 'smtp.gmail.com'; 
    $mail->SMTPAuth = true;                               
    $mail->Username = '[email protected]';                 
    $mail->Password = 'secret';                           
    $mail->SMTPSecure = 'ssl';                            
    $mail->Port = 465;                                    

    //Recipients
    $mail->setFrom('[email protected]');
    $mail->addAddress('[email protected]');     


    //Content
    $mail->isHTML(true);                                 
    $mail->Subject = 'subject';
    $mail->Body    = 'HTML message body <b>in bold!</b>';
    $mail->AltBody = 'body in plain text';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
}            
?>

Mise à jour

Quand j'essaie avec $mail->SMTPSecure = 'ssl'; et $mail->Port = 465; Je reçois

2017-10-01 13:04:25 Connection: opening to ssl://smtp.gmail.com:465, timeout=300, options=array()
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): Failed to enable crypto [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 SMTP ERROR: Failed to connect to server: (0)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Message could not be sent.Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

Quand j'essaie avec $mail->SMTPSecure = 'tls'; et $mail->Port = 587; Je reçois

2017-10-01 13:07:20 Connection: opening to smtp.gmail.com:587, timeout=300, options=array()
2017-10-01 13:07:21 Connection: opened
2017-10-01 13:07:21 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP l4sm5217189wrb.74 - gsmtp
2017-10-01 13:07:21 CLIENT -> SERVER: EHLO localhost
2017-10-01 13:07:21 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [85.75.196.114]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250 SMTPUTF8
2017-10-01 13:07:21 CLIENT -> SERVER: STARTTLS
2017-10-01 13:07:21 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2017-10-01 13:07:21 Connection failed. Error #2: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [C:\php\PHPMailer\src\SMTP.php line 403]
SMTP Error: Could not connect to SMTP Host.
2017-10-01 13:07:21 CLIENT -> SERVER: QUIT
2017-10-01 13:07:21 SERVER -> CLIENT: 
2017-10-01 13:07:21 SMTP ERROR: QUIT command failed: 
2017-10-01 13:07:21 Connection: closed
SMTP Error: Could not connect to SMTP Host.
Message could not be sent.Mailer Error: SMTP Error: Could not connect to SMTP Host.
3
slevin

J'ai rencontré cela sur un nouveau serveur Windows IIS récemment. L'appel cURL était à mon propre domaine à partir d'un script de commandes, qui s'exécutent tous les deux sur le même serveur.

J'avais ajouté

127.0.0.1  mydomain.com

dans le fichier hosts, et j'avais oublié de le supprimer quand j'ai changé le DNS public.

Le serveur est derrière Cloudflare, donc mon cURL obtenait un certificat CF Origin et non le vrai certificat servi par Cloudflare.

La suppression de l'entrée d'hôtes a résolu le problème.

0
IanMcL