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 4.2、PHP 5.6、Apache 2.4を使用しています
GoDaddy SSLをAmazon ec2 Linuxにインストールしています。
Httpsでサイトにアクセスすると、SSLは正常に機能します。
関数を呼び出したときにエラーが発生しました:
<?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' );
} );
}
?>
私はこれについていくつかの記事を読んで、いくつかの変更を加える必要があると言っていました。彼らはそのコードを入れましたが、どこに挿入するかわかりません。
これを読んでいる: https://www.mimar.rs/en/sysadmin/2015/php-5-6-x-ssltls-peer-certificates-and-hostnames-verified-by-default/ =
このphpのドキュメント http://php.net/manual/en/migration56.openssl.php これは理解するのが困難です。
だから私の質問は、この問題を解決する方法ですか?
app/config/email.php
を変更してみてください
smtp
からmail
以下のコードを/config/mail.phpに追加する必要があります(laravel 5.1、5.2、5.4でテストおよび動作しました)
'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],
編集者注:SSL検証を無効にすると、セキュリティに影響します。SSL/HTTPS接続の信頼性を検証しないと、悪意のある攻撃者は信頼できるエンドポイント(GitHubや他のリモートGitホストなど)になりすますことができ、あなたは 中間者攻撃 。 これを解決策として使用する前に、セキュリティの問題を完全に理解してください。
laravel 4.2にもこのエラーがあります。このようにして解決しました。 StreamBuffer.php
をご覧ください。私にとってはxamppを使用しており、プロジェクト名はitis_dbです。これは私のパスがこのようになっているためです。だからあなたのものに合わせて見つけてみてください
C:\ xampp\htdocs\itis_db\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php
streamBuffer.php内でこの関数を見つけます
private function _establishSocketConnection()
この関数内にこの2行を貼り付けます
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
編集者注:SSL検証を無効にすると、セキュリティに影響します。SSL/HTTPS接続の信頼性を検証しないと、悪意のある攻撃者は信頼できるエンドポイント(GitHubや他のリモートGitホストなど)になりすますことができ、あなたは 中間者攻撃 。 これを解決策として使用する前に、セキュリティの問題を完全に理解してください。
ブラウザをリロードして、プロジェクトを再度実行してください。私にとっては、このように着ます:
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;
}
この問題を解決することを願って.....
これに対する簡単な修正は、config/mail.phpを編集し、TLSをオフにすることです。
'encryption' => env('MAIL_ENCRYPTION', ''), //'tls'),
基本的にこれを行うことで
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
セキュリティも緩める必要がありますが、最初のオプションではベンダーのコードに飛び込む必要はありません。
Editor's note:著者が述べたように:SSL検証の無効化にはセキュリティへの影響 SSL/HTTPSの信頼性の検証なし接続では、悪意のある攻撃者が信頼できるエンドポイント(GitHubまたは他のリモートGitホストなど)になりすますことができ、 中間者攻撃 に対して脆弱になります。 これをソリューションとして使用する前に、セキュリティの問題を完全に理解してください。
この問題を解決するには、まず接続しているホストのSSL証明書を確認する必要があります。たとえば、 ssllabs または 他のsslツール を使用します。私の場合、中間証明書が間違っていました。
証明書に問題がない場合は、サーバー上のopenSSLが最新であることを確認してください。 openssl -v
を実行して、バージョンを確認します。たぶん、あなたのバージョンは古い証明書で動作するようです。
ごくまれに、verify_peer、verify_peer_name、またはallow_self_signedなどのSSLセキュリティ機能を無効にしたい場合があります。これには細心の注意を払い、never本番環境ではこれを使用してください。これは一時的なテストのオプションにすぎません。
私の場合、私は次のことをしました
$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();
Laravel 5.4
for gmail
。envファイル
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>'
),
],
App/config/mailphpの読み取り
Supported : "smtp", "mail", "sendmail"
マシンにインストールされているメールユーティリティに応じて、ドライバキーの値を入力します。私はやります
'driver' => 'sendmail',