web-dev-qa-db-ja.com

LaravelのSMTPドライバーで自己署名TLS証明書を処理する方法

私はこの構成でメールを送信しようとしています:

return [

    'driver'     => 'smtp',

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

    'port'       => 26,

    'from'       => ['address' => '[email protected]', '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

10
Alan

まあそのリンクであなたが提供したソリューションは簡単です。

正しい解決策は、SSL構成を修正することです。これはPHPのせいではありません。

7
geggleto

これをconfig/mail.phpの下部に追加します

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

これはあなたの問題を解決します。

編集者注:SSL検証を無効にすると、セキュリティに影響します。SSL/HTTPS接続の信頼性を検証しないと、悪意のある攻撃者が信頼されたエンドポイント(GitHubや他のリモートGitホストなど)になりすますことができ、次の脆弱性があります 中間者攻撃これをソリューションとして使用する前に、セキュリティの問題を完全に理解してください。

21
M Arfan

私の場合、問題はSSLに関連していました。私のSMTPには自己署名証明書があり、私のlaravelはPHP 5.6の上で実行されていました。これにより、 'allow_self_signed'コンテキスト変数がfalseになり、 'verify_peerが有効になります'したがって、メールを送信するときにエラーをポップします。

私はswiftmailerコードをハッキングしたくなかったので、laravelを実行するシステムの信頼できるCAとして、サーバーの認証局(CA)ファイルを追加しました。

私は私のようなSMTPサーバーのCA証明書を取得することをやった

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

そして、それを/usr/local/share/ca-certificates/my_cert.crtという名前のファイルにubuntu 14.04があるmy laravel machineで書き込みます。ファイルを.crtで終了し、それを全員。

次にupdate-ca-certificatesを呼び出すと、証明書がサーバーの有効なCAのリストに追加されます。

3
mosh442