【问题标题】:How to deal with self-signed TLS certificates in Laravel's SMTP driver?如何处理 Laravel 的 SMTP 驱动程序中的自签名 TLS 证书?
【发布时间】:2015-08-23 05:16:16
【问题描述】:

我正在尝试使用此配置发送电子邮件:

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,

];

当我提交表单时,我收到此错误:

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

【问题讨论】:

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


    【解决方案1】:

    编者注:禁用 SSL 验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以冒充一个受信任的端点(例如 GitHub 或其他一些远程 Git 主机),您将容易受到 Man-in-the-Middle Attack 的攻击。

    在将其用作解决方案之前,请确保您完全了解安全问题。

    在你的 config/mail.php 底部添加这个

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

    这会解决你的问题。

    【讨论】:

    • 人们应该非常清楚,使用此解决方案应该非常清楚,这仅比不使用加密稍微安全一点,而使用适当的 SSL 和对等验证证书要安全得多。仅当您 100% 知道您需要使用自签名证书并且您 100% 确定它没有被篡改时才使用它,并且永远不要在生产中使用它。
    【解决方案2】:

    在您提供的那个链接中,解决方案是直截了当的。

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

    如何解决?在 config/mail.php ,'driver' => env('MAIL_DRIVER', 'smtp'), 应该是 'driver' => env('MAIL_DRIVER', 'mail'), (学分:Danyal Sandeelo

    【讨论】:

      【解决方案3】:

      如果您使用的是 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,
                  ],
              ],
          ],
      ],
      

      【讨论】:

        【解决方案4】:

        在我的情况下,问题与 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 列表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-08
          • 2013-08-13
          • 2014-05-05
          • 1970-01-01
          • 2019-12-03
          相关资源
          最近更新 更多