如何修复 stream_socket_enable_crypto() : SSL 操作失败,代码1

stream_socket_enable_crypto(): SSL operation failed with code 1.
OpenSSL Error messages: error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我使用 Laravel 4.2,PHP 5.6,Apache 2.4

我已经在 Amazon ec2 Linux 中安装了 GoDaddy SSL。

当我使用 https 访问站点时,SSL 工作正常。

当我调用我的函数时,错误发生了:

<?php


public function sendEmail()
{
\Mail::send ( 'emails.code.code', $data, function ($sendemail) use($email) {
$sendemail->from ( 'info@me.com', 'Me Team' );
$sendemail->to ( $email, '' )->subject ( 'Activate your account' );
} );


}
?>

我读了一些关于这方面的文章,他们说有些东西我们应该做一些改变,他们把代码,但我不知道在哪里插入它。

我一直在看这个: https://www.mimar.rs/en/sysadmin/2015/php-5-6-x-ssltls-peer-certificates-and-hostnames-verified-by-default/

以及这个难以理解的 php http://php.net/manual/en/migration56.openssl.php文档。

所以我的问题是如何解决这个问题?

230064 次浏览

试试改变 app/config/email.php

smtp呼叫 mail

编者按 : 禁用 SSL 验证有 安全隐患。。如果没有验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模仿 Gmail 这样的可信端点,而且你很容易受到 中间人攻击的攻击。

在使用它作为解决方案之前,一定要充分理解安全性问题。

我在幼虫4.2中也有这个错误,我是这样解出来的。找出 StreamBuffer.php。对于我来说,我使用 xampp,我的项目名称是 tis _ db,因为我的路径是这样的。所以试着根据你自己的想法去找

C: xampp htdocs tis _ db 稳定器供应商 Swift-mailer Swift-mailer lib class 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;
}

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

编者按 : 禁用 SSL 验证有 安全隐患。。如果没有验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模仿 Gmail 这样的可信端点,而且你很容易受到 中间人攻击的攻击。

在使用它作为解决方案之前,一定要充分理解安全性问题。

这个问题的简单解决方法可能是编辑 config/mail.php 并关闭 TLS

'encryption' => env('MAIL_ENCRYPTION', ''), //'tls'),

基本上就是这样

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

您也应该失去安全性,但是在第一个选项中,没有必要深入研究供应商的代码。

读取 app/config/mailphp

Supported : "smtp", "mail", "sendmail"

根据您机器上安装的邮件实用程序,填写驱动程序键的值

'driver' => 'sendmail',

编者按 : 禁用 SSL 验证有 安全隐患。。如果没有验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模仿 Gmail 这样的可信端点,而且你很容易受到 中间人攻击的攻击。

在使用它作为解决方案之前,一定要充分理解安全性问题。

您可以在/config/mail.php 中添加以下代码(在 laravel 5.1、5.2、5.4上进行了测试和工作)

'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],

要解决这个问题,首先需要检查要连接到的主机的 SSL 证书。例如使用 石板其他 SSL 工具。在我的情况下,中间证书是错误的。

如果证书没问题,请确保服务器上的 openSSL 是最新的。运行 openssl -v检查您的版本。也许你的版本太老了,不适合使用证书。

在非常罕见的情况下,您可能希望禁用 ssl 安全特性,比如 valid_ peer、 valid_ peer _ name 或 allow _ self _ signed。请非常小心使用这个和 永远不会在生产中使用这个。这只是临时测试的一个选项。

Laravel 5.4
输入 < strong > gmail


。 env文件中

MAIL_DRIVER=mail
MAIL_HOST=mail.gmail.com
MAIL_PORT=587
MAIL_USERNAME=<username>@gmail.com
MAIL_PASSWORD=<password>
MAIL_ENCRYPTION=tls

Config/mail.php

'driver' => env('MAIL_DRIVER', 'mail'),


'from' => [
'address' => env(
'MAIL_FROM_ADDRESS', '<username>@gmail.com'
),
'name' => env(
'MAIL_FROM_NAME', '<from_name>'
),
],

在我的情况下,我确实遵循

$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = '<YOUR HOST>';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = '<USERNAME>';
$mail->Password = '<PASSWORD>';
$mail->SMTPSecure = '';
$mail->smtpConnect([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$mail->smtpClose();


$mail->From = '<MAILFROM@MAIL.COM>';
$mail->FromName = '<MAIL FROM NAME>';


$mail->addAddress("<SENDTO@MAIL.com>", '<SEND TO>');


$mail->isHTML(true);
$mail->Subject= '<SUBJECTHERE>';
$mail->Body =  '<h2>Test Mail</h2>';
$isSend = $mail->send();
$default = [ ... ];


$turnOffSSL = [
'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],
];


$environment = env('APP_ENV');


if ($environment === 'local') {
return array_merge($default, $turnOffSSL);
}


return $default;

编辑您的. env 并在邮件配置行后添加此行

MAIL_ENCRYPTION=""

保存并尝试发送电子邮件

如何修复 Laravel (至少5,6,7) ,WordPress (我猜还有其他 PHP + cURL实现) :

CURL 网站下载最新的 Ccert.pem文件。

wget https://curl.haxx.se/ca/cacert.pem

编辑 php.ini(你可以通过 php --ini找到它) ,更新(或者创建如果它们不存在的话)这两行:

curl.cainfo="/path/to/downloaded/cacert.pem"
...
openssl.cafile="/path/to/downloaded/cacert.pem"

这些行应该已经存在但被注释掉了,所以取消注释并使用下载的 cacert.pem路径编辑这两个值

重启 PHP 和 Nginx/Apache。

编辑: 您可能需要 chown/chmod下载的证书文件,以便 PHP (和运行它的用户)可以读取它。

来源

最后! 这是我的 AVG 防病毒,它有一个功能称为电子邮件屏蔽,禁用它和错误了。

这种情况从今天开始在我的一个服务器上发生,它使用 wordpress 和一个使用 PHPMailer 的插件,没有最近的变化。

解决方案: sudo yum install ca-securities

现在它又完美地工作了,我还重新启动了 httpd (不确定是否需要)

我不知道真正的问题是什么,我怀疑那是旧的中央情报局证书包里的一个硬编码日期。

改变加密类型从 SSL < strong > TLS 的工作形式我。

转到供应商 Swift-mailer 的自由类 Swift Transport StreamBuffer.php

注释行250添加以下内容:

//$options = [];
$options['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true);
    

对于 Laravel9,以下内容足以禁用 ssl 检查:

 'verify_peer'       => false,

示例: < br >//config/mail.php < br >

'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'auth_mode'  => null,
'verify_peer' => false,
],
...

我用 symfony 修改了 dotEnv 以包含一些小信息,它工作得很好

MAILER_DSN=smtp://user:pass@container_name:25?verify_peer=false&verify_peer_name=false&allow_self_signed=true

我自己的情况下,这个问题发生在网站上托管的 VPS 与 cPanel 的 WHM。更新后,所有通过 Gmail SMTP 发送的电子邮件停止工作。

作为一个解决方案,在 WHM 我不得不关闭

Restrict outgoing SMTP to root, exim, and mailman (FKA SMTP Tweak)

设置

Home / Server Configuration / Tweak Settings

看图。

enter image description here

我猜在 WHM 更新这个设置是打开的或者可能是一个新的设置,我不确定。