如何在Laravel的SMTP驱动程序中处理自签名TLS证书?

时间:2015-06-08 16:14:13

标签: php laravel email ssl self-signed-certificate

我正在尝试发送包含此配置的电子邮件:

return [

    'driver'     => 'smtp',

    'host'       => 'mail.mydomain.com',

    'port'       => 26,

    'from'       => ['address' => 'mailer@mydomain.com', 'name' => 'Mailer'],

    'encryption' => 'tls',

    'username'   => env('MAIL_USERNAME'),

    'password'   => env('MAIL_PASSWORD'),

    'sendmail'   => '/usr/sbin/sendmail -bs',

    'pretend'    => false,

];

当我提交表格时,我收到了这个erorr:

ErrorException in StreamBuffer.php line 95:
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中解决它。

https://github.com/PHPMailer/PHPMailer/issues/368

4 个答案:

答案 0 :(得分:19)

在config / mail.php

的底部添加
'stream' => [
   'ssl' => [
       'allow_self_signed' => true,
       'verify_peer' => false,
       'verify_peer_name' => false,
   ],
],

这将解决您的问题。

  

编辑注释 :禁用SSL验证会产生安全隐患。如果不验证SSL / HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到Man-in-the-Middle Attack的攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。

答案 1 :(得分:6)

在您提供的链接中,解决方案很简单。

  

正确的解决方案是修复您的SSL配置 - 这不是PHP的错!

答案 2 :(得分:4)

如果您使用的是Laravel 7.0,则可以通过以下方式在SwiftMailer中禁用SSL验证(请注意,不建议禁用SSL验证!):

config/mail.php

'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,
        'stream' => [
            'ssl' => [
                'allow_self_signed' => true,
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        ],
    ],
],

答案 3 :(得分:3)

在我的情况下,问题与SSL有关。我的SMTP有一个自签名证书,我的laravel运行在PHP 5.6之上,它禁用'allow_self_signed'上下文变量为false并启用'verify_peer',因此在发送电子邮件时弹出错误。

由于我不想破解swiftmailer代码,我将服务器的证书颁发机构(CA)文件添加为我的系统执行laravel的可信CA.

我这样做了我的smtp服务器的CA证书,比如

-----BEGIN CERTIFICATE-----
MIIElTCCA32gAwIBAgIJAMZjjNg64RQwMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD
VQQGEwJVUzEMMAoGA1UECBMDTi9BMQwwCgYDVQQHEwNOL0ExJDAiBgNVBAoTG1pp
...
5a8a4QEwWmnAOgHetsOCvhfeGW3yAJPD8Q==
-----END CERTIFICATE-----

并将其写入我的laravel机器,该机器具有ubuntu 14.04到名为/usr/local/share/ca-certificates/my_cert.crt的文件。使用.crt结束文件并使其对所有人都可读是至关重要的。

然后调用update-ca-certificates,证书将添加到服务器的有效CA列表中。