Php 如何修复流\u套接字\u启用\u加密():SSL操作失败,代码为1
Im使用Laravel4.2、PHP5.6、Apache2.4 我在AmazonEC2Linux中安装了GoDaddySSL 当我使用https访问站点时,SSL工作正常 调用函数时出错:Php 如何修复流\u套接字\u启用\u加密():SSL操作失败,代码为1,php,amazon-ec2,laravel-4,ssl-certificate,apache2.4,Php,Amazon Ec2,Laravel 4,Ssl Certificate,Apache2.4,Im使用Laravel4.2、PHP5.6、Apache2.4 我在AmazonEC2Linux中安装了GoDaddySSL 当我使用https访问站点时,SSL工作正常 调用函数时出错: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certific
stream_socket_enable_crypto(): SSL operation failed with code 1.
OpenSSL Error messages: error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
我读了一些关于这方面的文章,他们说有些事情我们应该做一些修改,他们把代码放在哪里,但我不知道在哪里插入它
我一直在读:
这是很难理解的php文档
所以我的问题是如何解决这个问题?尝试更改
app/config/email.php
smtp
至mail
编者按:禁用SSL验证具有安全隐患。如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟Gmail等受信任端点,您将容易受到攻击
在将其用作解决方案之前,请确保您完全了解安全问题。
我在Laravel4.2中也有这个错误,我是这样解决的。查找StreamBuffer.php
。对我来说,我使用xampp,我的项目名是itis_db,我的路径是这样的。所以,试着根据你的答案去寻找
C:\xampp\htdocs\itis\u db\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php
<?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' );
} );
}
?>
并在StreamBuffer.php中找到此函数
<?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' );
} );
}
?>
并将这两行粘贴到此函数内
private function _establishSocketConnection()
然后重新加载浏览器并尝试再次运行项目。对我来说,我穿的是这样的:
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
希望你能解决这个问题
编者按:禁用SSL验证具有安全隐患。如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟Gmail等受信任端点,您将容易受到攻击
在将其用作解决方案之前,请确保您完全了解安全问题。
解决这个问题的简单方法可能是编辑config/mail.php并关闭TLS
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;
}
基本上是这样做的
'encryption' => env('MAIL_ENCRYPTION', ''), //'tls'),
您也应该放松安全性,但在第一个选项中,不需要深入研究供应商的代码。阅读app/config/mailphp
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
根据计算机上安装的邮件实用程序,填写驱动程序密钥的值。我愿意
Supported : "smtp", "mail", "sendmail"
编者按:禁用SSL验证具有安全隐患。如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟Gmail等受信任端点,您将容易受到攻击
在将其用作解决方案之前,请确保您完全了解安全问题。
您可以在/config/mail.php中添加以下代码(在laravel 5.1、5.2、5.4上测试和使用)
要解决此问题,首先需要检查所连接主机的SSL证书。例如使用或。就我而言,中级证书是错误的 如果证书正常,请确保服务器上的openSSL是最新的。运行
openssl-v
检查您的版本。可能您的版本太旧,无法使用证书
在非常罕见的情况下,您可能希望禁用ssl安全功能,如verify_peer、verify_peer_name或allow_self_signed。请非常小心,不要在生产中使用。这只是临时测试的一个选项
对于Laravel 5.4对于gmail
在.env文件中
'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],
MAIL\u DRIVER=MAIL
MAIL\u HOST=MAIL.gmail.com
邮件端口=587
MAIL_USERNAME=@gmail.com
邮箱密码=
邮件加密=tls
在config/mail.php中
MAIL_DRIVER=mail
MAIL_HOST=mail.gmail.com
MAIL_PORT=587
MAIL_USERNAME=<username>@gmail.com
MAIL_PASSWORD=<password>
MAIL_ENCRYPTION=tls
'driver'=>env('MAIL\u driver','MAIL'),
'来自'=>[
'地址'=>环境(
“从地址发送邮件”,“@gmail.com”
),
'name'=>env(
“从您的姓名处发送邮件”
),
],
在我的情况下,我做了以下几点
'driver' => env('MAIL_DRIVER', 'mail'),
'from' => [
'address' => env(
'MAIL_FROM_ADDRESS', '<username>@gmail.com'
),
'name' => env(
'MAIL_FROM_NAME', '<from_name>'
),
],
$mail=新的PHPMailer;
$mail->isSMTP();
$mail->Host='';
$mail->Port=587;
$mail->SMTPAuth=true;
$mail->Username='';
$mail->Password='';
$mail->SMTPSecure='';
$mail->smtpConnect([
“ssl”=>[
“验证对等方”=>false,
'verify_peer_name'=>false,
“允许自签名”=>true
]
]);
$mail->smtpClose();
$mail->From='';
$mail->FromName='';
$mail->addAddress(“,”);
$mail->isHTML(true);
$mail->Subject='';
$mail->Body='testmail';
$isSend=$mail->send();
编辑您的.env并在邮件配置行之后添加此行
$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;
保存并尝试发送电子邮件如何修复Laravel 7: 从下载最新的文件 编辑php.ini(您可以通过
php--ini
找到它),更新(或者创建,如果它们还不存在)这两行:
wget https://curl.haxx.se/ca/cacert.pem
这些行应该已经存在,但已注释掉,因此取消注释它们,并使用下载的cacert.pem
重新启动PHP和Nginx/Apache
编辑:您可能需要对下载的证书文件进行chown/chmod,以便PHP(及其用户)可以读取它
Laravel框架问题,更改协议删除了问题。现在它没有抛出错误,但在将其更改为“邮件”后,我没有收到邮件,而是显示为在我的应用程序中发送的邮件,这可能是什么问题?将此更改为邮件将直接从服务器发送邮件,而不是连接到smtp服务器!这是一个非常糟糕的答案,因为它没有描述这种变化的后果。通过SMTP发送电子邮件时,laravel会登录到您的服务器,并代表您发送和发送电子邮件。如果您将其更改为“邮件”,它将通过PHP邮件发送邮件,这意味着它将受到更高的垃圾邮件分数的影响,因为PHP本质上是在欺骗电子邮件。您可以使用PHP邮件从发送电子邮件bill@microsoft.com如果你愿意的话。但它们最终可能会变成垃圾邮件。更多信息请点击这里。回答正确!Th
MAIL_ENCRYPTION=""
wget https://curl.haxx.se/ca/cacert.pem
curl.cainfo="/path/to/downloaded/cacert.pem"
...
openssl.cafile="/path/to/downloaded/cacert.pem"