it-swarm.com.de

so beheben Sie stream_socket_enable_crypto (): SSL-Operation mit Code 1 fehlgeschlagen

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

Ich benutze Laravel 4.2, PHP 5.6, Apache 2.4

Ich habe GoDaddy SSL in Amazon ec2 Linux installiert.

SSL funktioniert gut, wenn ich die Site mit https besuche.

Der Fehler ist beim Aufruf meiner Funktion aufgetreten:

<?php

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

}
?>

Ich habe einige Artikel darüber gelesen, sie sagten, dass es Dinge gibt, die wir ändern sollten. Sie haben diesen Code eingefügt, aber ich weiß nicht, wo er eingefügt werden soll.

Lesen Sie dies hier: https://www.mimar.rs/de/sysadmin/2015/php-5-6-x-ssltls-peer-zertifikate-und-Hostnamen-verifiziert-von-default/

und diese Dokumentation von php http://php.net/manual/de/migration56.openssl.php die schwer zu verstehen ist.

Meine Frage ist also, wie man dieses Problem lösen kann.

28
user4612911

Ändern Sie den app/config/email.php.

smtp zu mail

17
user4634724

Sie sollten den folgenden Code in /config/mail.php hinzufügen (getestet und an Laravel 5.1, 5.2, 5.4 bearbeitet)

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

Anmerkung des Herausgebers: Das Deaktivieren der SSL-Überprüfung hat Sicherheitsauswirkungen. Ohne Überprüfung der Authentizität von SSL/HTTPS-Verbindungen kann ein böswilliger Angreifer einen vertrauenswürdigen Endpunkt (z. B. GitHub oder einen anderen entfernten Git-Host) annehmen und Sie sind anfällig für ein Man-in-the-Middle Attacke . Stellen Sie sicher, dass Sie die Sicherheitsprobleme vollständig verstanden haben, bevor Sie dies als Lösung verwenden.

78
manoj yadav

Ich habe auch diesen Fehler in Laravel 4.2 auf diese Weise gelöst. Finde StreamBuffer.php heraus. Für mich verwende ich xampp und mein Projektname ist itis_db. Dafür ist mein Weg so. Also versuchen Sie es nach Ihrem zu finden

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

und finden Sie diese Funktion in StreamBuffer.php

private function _establishSocketConnection()

und fügen Sie diese beiden Zeilen in diese Funktion ein 

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

Anmerkung des Herausgebers: Das Deaktivieren der SSL-Überprüfung hat Sicherheitsauswirkungen. Ohne Überprüfung der Authentizität von SSL/HTTPS-Verbindungen kann ein böswilliger Angreifer einen vertrauenswürdigen Endpunkt (z. B. GitHub oder einen anderen entfernten Git-Host) annehmen und Sie sind anfällig für ein Man-in-the-Middle Attacke . Stellen Sie sicher, dass Sie die Sicherheitsprobleme vollständig verstanden haben, bevor Sie dies als Lösung verwenden.

laden Sie Ihren Browser neu und versuchen Sie, Ihr Projekt erneut auszuführen. Für mich ziehe ich so an:

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;
}

Ich hoffe, Sie werden dieses Problem lösen ...

26

Einfache Lösung für dieses Problem könnte die Bearbeitung von config/mail.php und das Deaktivieren von TLS sein

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

Grundsätzlich damit

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

Sie sollten auch die Sicherheit verlieren, aber bei der ersten Option müssen Sie nicht in den Code des Herstellers eintauchen.

Anmerkung des Herausgebers: Wie der Autor gesagt hat: Das Deaktivieren der SSL-Überprüfung hat Sicherheitsauswirkungen. Ohne Überprüfung der Authentizität von SSL/HTTPS-Verbindungen kann ein böswilliger Angreifer einen vertrauenswürdigen Endpunkt (z. B. GitHub oder einen anderen entfernten Git-Host) annehmen und Sie sind anfällig für ein Man-in-the-Middle Attacke . Stellen Sie sicher, dass Sie die Sicherheitsprobleme vollständig verstanden haben, bevor Sie dies als Lösung verwenden.

7
monas

in meinem Fall habe ich folgendes getan

$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 = '<[email protected]>';
$mail->FromName = '<MAIL FROM NAME>';

$mail->addAddress("<[email protected]>", '<SEND TO>');

$mail->isHTML(true);
$mail->Subject= '<SUBJECTHERE>';
$mail->Body =  '<h2>Test Mail</h2>';
$isSend = $mail->send();
1
Renish Gotecha

Um dieses Problem zu beheben, müssen Sie zunächst die SSL-Zertifikate des Hosts überprüfen, zu dem Sie eine Verbindung herstellen. Zum Beispiel mit ssllabs oder anderen ssl-Tools . In meinem Fall war das Zwischenzertifikat falsch.

Wenn das Zertifikat in Ordnung ist, stellen Sie sicher, dass openSSL auf Ihrem Server auf dem neuesten Stand ist. Führen Sie openssl -v aus, um Ihre Version zu überprüfen. Vielleicht ist Ihre Version zu alt, um mit dem Zertifikat zu arbeiten.

In sehr seltenen Fällen möchten Sie möglicherweise die ssl-Sicherheitsfunktionen wie verify_peer, verify_peer_name oder allow_self_signed deaktivieren. Bitte seien Sie sehr vorsichtig damit und never verwenden Sie dies in der Produktion. Dies ist nur eine Option für temporäre Tests.

1
PiTheNumber

für Laravel 5.4  
für gmail


in .env file

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

in config/mail.php

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

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

App/config/mailphp lesen

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

Geben Sie abhängig von den auf Ihrem Computer installierten Mail-Dienstprogrammen den Wert des Treiberschlüssels ein. Ich würde tun

'driver' => 'sendmail',
0
Shadrack Wattai