PHPMailer - SSL3_GET_SERVER_CERTIFICATE:证书验证失败

gor*_*181 25 php phpmailer

遇到过应该从具有自签名证书的邮件服务器发送电子邮件的问题,我得到的错误是:

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.
Run Code Online (Sandbox Code Playgroud)

有没有人遇到类似的东西?

编辑:

我还尝试设置stream_context参数(参数:SSL上下文选项):

$options['ssl']['verify_peer'] = false;
$options['ssl']['verify_peer_name'] = false;
$options['ssl']['allow_self_signed'] = true;
Run Code Online (Sandbox Code Playgroud)

没有运气,它仍然失败,出现与上面指出的相同的错误.

谢谢.

Syn*_*hro 85

PHP 5.6引入了SSL证书验证,因此如果您的配置中断,它将失败并显示此错误.您应修复SSL,但可以通过将SMTPOptions属性设置为不验证证书来恢复旧行为:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);
Run Code Online (Sandbox Code Playgroud)

编辑库会使图书馆的整个过程失败 - 如果按照Kaf的回答建议,你的代码会在升级时中断.真的,不要这样做.

编者注:禁用SSL验证具有安全隐患.如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到中间人攻击.在将此作为解决方案之前,请确保完全了解安全问题.

  • 这应该是公认的答案. (5认同)

小智 20

我也有同样的问题.所以我更改了第238行中的文件class.smtp.php:

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);
       }
Run Code Online (Sandbox Code Playgroud)

现在它工作正常!

编者注:禁用SSL验证具有安全隐患.如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到中间人攻击.在将此作为解决方案之前,请确保完全了解安全问题.

  • `connect`函数采用`options`数组参数是有原因的 - 它允许你设置它而不必改变库. (8认同)
  • 切换到邮件传输并不能解决问题,它只是将其移动到其他地方.请不要赞成这个答案,因为它表明了实施解决方案的根本错误方法. (3认同)