web-dev-qa-db-ja.com

PHPMailerがPHPを生成します警告:stream_socket_enable_crypto():ピア証明書が予期したものと一致しませんでした

私はPHP 5.6でPHPMailerを使用していますが、PHP 5.6で認証されたセキュリティの強化は確かに楽しいです。

Dreamhostでホストされているドメインにテストメッセージを送信しようとしています。PHPMailerから返されるエラーは次のとおりです。SMTPホストに接続できませんでした。

ただし、このエラーは正しくありません。ロギングを有効にしているので、実際に実行されています。

接続:mx1.sub4.homie.mail.dreamhost.com:25、timeout=30、options=array()に接続しています。接続:開いているS:220 homiemail-mx32.g.dreamhost.com ESMTP

C:EHLO s81a.ikbb.com

S:250-homiemail-mx32.g.dreamhost.com 250-PIPELINING 250-SIZE 40960000 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250 8BITMIME

C:STARTTLS

S:220 2.0.0 TLSを開始する準備ができました

C:やめて

S:SMTPエラー:QUITコマンドが失敗しました:接続:閉じられました

PHPMailerがメッセージの送信を開始すべきときにQUITコマンドを発行するだけでjustめる理由を理解できませんでした。私は別のログから別の手がかりを得ました:

PHP警告:stream_socket_enable_crypto():ピア証明書CN = *.mail.dreamhost.com' did not match expected CN=mx1.sub4.homie.mail.dreamhost.com 'in /home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer/5.2.10 /class.smtp.php

使用している証明書の検証を防ぐためにいくつかのカスタムオプションを使用する場合、続行することができます。ここに私が持っているものがあります:

        $mail->SMTPOptions = array (
        'ssl' => array(
            'verify_peer'  => false,
            'verify_peer_name'  => false,
            'allow_self_signed' => true));

SMTPOptionsをそこに入れてピア検証をスキップすると、メッセージはOKになります-PHPに警告はまったくありません。

そのエラーをトラップするにはどうすればいいのですか?問題があることは知っていますが、メッセージを送信しますか?

40
Rob Gunsuka

私は同じ問題を抱えていたので、 PHPMailer documentation で答えを見つけました。

PHP 5.6証明書検証の失敗

以前のバージョンからの変更では、PHP 5.6はSSL接続の証明書を検証します。接続しているサーバーのSSL構成が正しくない場合、次のようなエラーが表示されます。

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1.
OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

これに対する正しい修正は、無効な、誤って設定された、または自己署名の証明書を適切な証明書に置き換えることです。それに失敗すると、 PHPMailer 5.2.10で導入されたSMTPOptionsプロパティ(以前のバージョンではSMTPクラスをサブクラス化することで可能です)が、これは推奨されません:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

Php.iniでこれらの設定をグローバルに変更することもできますが、それは非常に悪い考えです。 PHP 5.6は、非常に正当な理由でこの変更を行いました。

時々、この動作はそれほど明白ではありません。クライアントがSTARTTLSを実行しようとした直後にQUITを発行すると、暗号化エラーが発生する場合があります。その場合は、証明書または検証設定の状態を確認する必要があります。

71
Jesús Amieiro

PHP 5.6では、次を使用します。 「tls://」を追加することが重要です。

$mail->Host = gethostbyname('tls://smtp.gmail.com');

参照: http://php.net/manual/en/context.ssl.php

3
Chrisbot

CPanelを使用している人のために、PHPMailerのexamplesフォルダから SMTPチェックコード を試しましたが、同じエラーが発生しました:

PHP Warning: stream_socket_enable_crypto(): Peer certificate  CN=*.mail.dreamhost.com' did not match expected CN=mx1.sub4.homie.mail.dreamhost.com' in /home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer/5.2.10/class.smtp.php

PHPMailerに関連するエラーではないことに気づいたので、CentOSに関連する同様のエラーを検索し、光を放つこのリンクを見つけました: サードパーティ からメールを送信する問題。 cPanelの「SMTP制限」を確認する必要があります。

2
georch

PHPマシンでWordPress 5.6にアップグレードした後、同様の問題が発生しました。 WPForms(wp-mail-smtp)プラグインによるWP Mail SMTPは、localhostをSMTPホストとして使用するように構成されました。 SSL証明書で定義されているように、FQHN(完全修飾ホスト名)に変更しました。この変更後、正常に動作しています。

0
Sergey Vlasov