警告:stream_socket_enable_crypto():SSL操作失败,代码为1。

9

我在使用CSCart时遇到了问题,无法通过谷歌账户发送邮件。 为了检查是服务器配置问题还是CSCart脚本问题,我安装了干净的PHPMailer库并尝试使用示例脚本发送测试邮件。 结果相同:

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 [script path]/class.smtp.php on line 338    

使用控制台进行的OpenSSL连接工作正常。

FreeBSD 10.0,Apache24,php5.6。

我在谷歌上没有找到任何信息,现在甚至不知道在哪个配置文件中搜索问题的根源。


看起来您已经在PHP中启用了严格的安全检查,而连接正在未能通过此检查。您可以修复证书或降低您的PHP.ini设置。这尤其适用于PHP 5.6。 - Synchro
请问,我应该在php.ini中检查哪些设置? - Eugenijus
请查看我的答案,它可能会有所帮助:https://dev59.com/WmUp5IYBdhLWcg3w5Kg6#60709451 - vikas etagi
3个回答

4
这是由于PHP 5.6中的新默认验证策略造成的。它没有在php.ini中设置;它是您可以提供给fopen包装器或流上下文的选项。请查看此处的选项,尤其是verify_peer。PHPMailer允许您在smtpConnect()方法期间设置这些参数,但没有选项将选项传递到smtpSend()方法中,因此您需要子类化PHPMailer才能使用它。
您可能会发现另一种选择更简单 - 不要尝试使用自签名或不可验证的证书

3

造成这个错误的配置很多,但更常见的是系统配置不正确。要正确设置,请按照以下步骤进行:

  1. 检查你的OPENSSL是否有cacert.pem文件。如果没有,请根据你的PHP版本下载相应版本的cacert.pem并将php.ini文件配置为“2”。

  2. 如果你已经有了这个文件,则必须在php.ini文件中查找它是否已经被设置。请查找以下行:

    openssl.cafile ="example address..\cacert.pem"

如果你发现了具有特定地址的行,请查找该地址中的cacert.pem文件,如果你找到了它,那么cacert.pem文件就完成了。否则,你应该使用正确的地址。


-3

在 Laravel 5.4 中出现错误

C:\xampp\htdocs\itis_db\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php

并在 StreamBuffer.php 文件中查找此函数。

private function _establishSocketConnection()

并将这两行代码粘贴到此函数内部

$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;

重新加载浏览器,然后再次尝试运行您的项目。对我来说,我是这样做的:

private function _establishSocketConnection()
{
    $host = $this->_params['host'];
    if (!empty($this->_params['protocol'])) {
        $host = $this->_params['protocol'].'://'.$host;
    }
    $timeout = 15;
    if (!empty($this->_params['timeout'])) {
        $timeout = $this->_params['timeout'];
    }
    $options = array();
    if (!empty($this->_params['sourceIp'])) {
        $options['socket']['bindto'] = $this->_params['sourceIp'].':0';
    }

   $options['ssl']['verify_peer'] = FALSE;
    $options['ssl']['verify_peer_name'] = FALSE;

    $this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
    if (false === $this->_stream) {
        throw new Swift_TransportException(
            'Connection could not be established with host '.$this->_params['host'].
            ' ['.$errstr.' #'.$errno.']'
            );
    }
    if (!empty($this->_params['blocking'])) {
        stream_set_blocking($this->_stream, 1);
    } else {
        stream_set_blocking($this->_stream, 0);
    }
    stream_set_timeout($this->_stream, $timeout);
    $this->_in = &$this->_stream;
    $this->_out = &$this->_stream;
}

希望你能解决这个问题.....


1
为什么人们总是编辑他们该死的供应商文件?非常糟糕的做法!! - Solomon Antoine
触碰供应商文件是一个非常不好的做法。 - Prabhu Nandan Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接