web-dev-qa-db-ja.com

stream_socket_enable_crypto()の修正方法:SSL操作がコード1で失敗しました

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 これは理解するのが困難です。

だから私の質問は、この問題を解決する方法ですか?

38
user4612911

app/config/email.phpを変更してみてください

smtpからmail

18
user4634724

以下のコードを/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ホストなど)になりすますことができ、あなたは 中間者攻撃これを解決策として使用する前に、セキュリティの問題を完全に理解してください。

98
manoj yadav

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

この問題を解決することを願って.....

29

これに対する簡単な修正は、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ホストなど)になりすますことができ、 中間者攻撃 に対して脆弱になります。 これをソリューションとして使用する前に、セキュリティの問題を完全に理解してください。

8
monas

この問題を解決するには、まず接続しているホストのSSL証明書を確認する必要があります。たとえば、 ssllabs または 他のsslツール を使用します。私の場合、中間証明書が間違っていました。

証明書に問題がない場合は、サーバー上のopenSSLが最新であることを確認してください。 openssl -vを実行して、バージョンを確認します。たぶん、あなたのバージョンは古い証明書で動作するようです。

ごくまれに、verify_peer、verify_peer_name、またはallow_self_signedなどのSSLセキュリティ機能を無効にしたい場合があります。これには細心の注意を払い、never本番環境ではこれを使用してください。これは一時的なテストのオプションにすぎません。

2
PiTheNumber

私の場合、私は次のことをしました

$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

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>'
    ),
],
0

App/config/mailphpの読み取り

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

マシンにインストールされているメールユーティリティに応じて、ドライバキーの値を入力します。私はやります

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