WordpressのWP Mail SMTPで証明書エラーの回避方法


概要

php5.3からphp7.4にバージョンアップしたところ、WordpressプラグインのWP Mail SMTPで以下のエラーが発生したので、その対処についてのメモ。

stream_socket_enable_crypto(): Peer certificate CN=`*.example.com’ did not match

エラー原因

原因はphp5.6からOpenSSLがバージョンアップし、ピア証明書が必須になったため。証明書がないとエラーが発生する。

暗号化されたすべてのクライアントストリームで、ピア検証がデフォルトで有効になりました。 デフォルトでは、OpenSSL のデフォルト CA > バンドルを使ってピア証明書を検証します。 たいていの場合は、正しい SSL 証明書を持つサーバーと通信するならこれを変更する必要> はありません。 OpenSSL が、よく知られた CA バンドルを使うように設定されているからです。

対処方法

対処方法としては、証明書を用意するか、php.iniの変更か、PHPMailerのSMTP Optionsで設定するかのいずれか。
WP Mail SMTPの場合、functions.phpに以下のコードで追加する。

functions.php

// WP Mail SMTPでメール送信元が効かなかったので設定。(証明書エラーとは関係ない)
add_filter( 'wp_mail_from', function() {
    return '[email protected]'; // 送信元メールアドレス
} );

// これ以降が証明書エラーのための設定。
function my_wp_mail_smtp_custom_options ( $phpmailer ) {
    if ( isset( $phpmailer->SMTPAuth ) ) {
        if ( $phpmailer->SMTPAuth == true ) {
            $phpmailer->SMTPOptions = array('ssl' => 
array(
 'verify_peer' => false,
 'verify_peer_name' => false,
 'allow_self_signed' => true));
        }
    }
    return $phpmailer;
}
add_filter("wp_mail_smtp_custom_options", "my_wp_mail_smtp_custom_options");

各オプションの説明は以下の通り。

オプション 説明 初期値
verify_peer SSLサーバー証明書の検証を要求するか否か TRUE
verify_peer_name ピア名の検証を要求するか否か TRUE
allow_self_signed 自己証明の証明書を許可するか否か FALSE

[email protected]