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' );
} );
}
?>
我读了一些关于这方面的文章,他们说有些东西我们应该做些改动,他们把那些代码放了,但我不知道在哪里插入它。
和php http://php.net/manual/en/migration56.openssl.php的这个文档很难理解。
所以我的问题是如何解决这个问题?
答案 0 :(得分:88)
您应该在/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 / HTTPS连接的真实性,恶意攻击者可以冒充一个受信任的端点(例如GitHub或其他一些远程Git主机),您将容易受到Man-in-the-Middle Attack的攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。
答案 1 :(得分:27)
我在laravel 4.2中也有这个错误。我这样解决了。找出StreamBuffer.php
。对我来说,我使用xampp,我的项目名称是itis_db,因为我的路径是这样的。所以试着根据你的那个找到
C:\ XAMPP \ htdocs中\ itis_db \厂商\ swiftmailer \ swiftmailer \ lib中\类\夫特\运输\ StreamBuffer.php
并在StreamBuffer.php中找到此函数
private function _establishSocketConnection()
并将此两行粘贴到此函数
中$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
编辑注释 :禁用SSL验证会产生安全隐患。如果不验证SSL / HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到Man-in-the-Middle Attack的攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。
并重新加载浏览器并尝试再次运行您的项目。对我来说,我穿上这样:
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;
}
希望你能解决这个问题.....
答案 2 :(得分:17)
尝试更改app/config/email.php
smtp
至mail
答案 3 :(得分:7)
轻松修复此问题可能是编辑config / mail.php并关闭TLS
'encryption' => env('MAIL_ENCRYPTION', ''), //'tls'),
基本上这样做
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
您也应该放弃安全性,但在第一个选项中,无需深入了解供应商的代码。
编辑注释 :正如作者所说:禁用SSL验证具有安全隐患。无需验证SSL / HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到Man-in-the-Middle Attack的攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。
答案 4 :(得分:3)
如何修复Laravel 7:
从cacert.pem下载最新的cURL website文件。
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(及其用户)可以读取它。
答案 5 :(得分:1)
要解决此问题,您首先需要检查所连接主机的SSL证书。例如,使用ssllabs或other ssl tools。就我而言,中间证书是错误的。
如果证书正确,请确保服务器上的openSSL是最新的。运行openssl -v
来检查您的版本。也许您的版本太旧了,无法使用证书。
在极少数情况下,您可能想要禁用ssl安全功能,例如verify_peer,verify_peer_name或allow_self_signed。请对此非常小心,并且切勿在生产中使用。这只是临时测试的一种选择。
答案 6 :(得分:0)
阅读app / config / mailphp
Supported : "smtp", "mail", "sendmail"
根据计算机上安装的邮件实用程序,填写驱动程序密钥的值。我会做的
'driver' => 'sendmail',
答案 7 :(得分:0)
对于 Laravel 5.4
用于 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>'
),
],
答案 8 :(得分:0)
就我而言,我确实遵循了
$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();
答案 9 :(得分:0)
$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;
答案 10 :(得分:0)
编辑您的.env并在邮件配置行之后添加此行
MAIL_ENCRYPTION=""
保存并尝试发送电子邮件
答案 11 :(得分:-1)
终于!这是我的 AVG 防病毒软件,它有一个称为电子邮件屏蔽的功能,将其禁用,错误消失了。