STARTTLS を使用した SMTP が正しく動作しない (postfix)

STARTTLS を使用した SMTP が正しく動作しない (postfix)

使うときはPHPメーラーPostfix 経由でメールを送信するには、次の変更を加えたデフォルトの設定を使用します。

# SMTP from other servers to yours
smtpd_tls_key_file = /etc/postfix/myletsencryptcert.key
smtpd_tls_cert_file = /etc/postfix/myletsencryptcert.crt
smtpd_tls_CAfile = /etc/postfix/myletsencryptcert.crt
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database =
    btree:/var/lib/postfix/smtpd_tls_session_cache

この設定を使用して実行するとPHPメーラーコマンドを実行した直後に接続に失敗したと表示されますSTARTTLSPHPメーラー設定は

$mail = new PHPMailer(true);

    $mail->isSMTP();
    $mail->Host       = 'localhost';
    //$mail->SMTPAuth   = true;
    $mail->Username   = '[email protected]';
    //$mail->Password   = 'passwordwhichissecretobviously';
    $mail->SMTPSecure = 'tls';
    $mail->Port       = 25;
    $mail->SMTPAutoTLS = false;

    $mail->setFrom("[email protected]", "Some person");
    $mail->addAddress("[email protected]");
    
    $mail->isHTML(true);
    $mail->Subject = "Web Development";
    $mail->Body    = "
Some random HTML message
";
    $mail->AltBody = "some normal message without HTML";
    $mail->XMailer    = "0"; 
    $mail->CharSet = 'UTF-8';
    $mail->Encoding = 'base64';
    
    $mail->DKIM_domain = 'example.com';
    $mail->DKIM_private = '/right/path/to/dkimkey/which/works/properly/dkim.key';
    $mail->DKIM_selector = 'default';
    $mail->DKIM_passphrase = '';
    $mail->DKIM_identity = $mail->From;
    $mail->DKIM_copyHeaderFields = false;

また、telnet を使用して実行した場合でも、STARTTLS コマンドを実行した後に取得されます。

これを使うと、メールを送信できることがわかりましたPHPメーラー:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer_name' => false
    )
);

しかし、それはセキュリティ上の問題になると思います。他にどうすればこれを機能させることができるでしょうか?

答え1

ピア名の検証は、ピア名がわかっている場合にのみ機能します。

サーバー名を として設定して、それを知らせますHost

// this is a name not mentioned in the cert
$mail->Host       = 'localhost';
// better: a full domain name
$mail->Host       = 'mx8.mydomain.example';

メール サーバーの名前の証明書を持っている必要があります。証明書内の名前を比較するだけでは、localhost証明書が適切であるかどうかは判断できません。証明書を検証するメール クライアントまたはテスト ツールは、比較対象の名前を知っている必要があります。

細かい点:SMTPSecure 値には、const 変数の値 (文字列 ) が含まれています。ドキュメントを調べないと値自体の意味がわからないため、"tls"名前 ( ) を使用します。PHPMailer::ENCRYPTION_STARTTLS

についてテルネット: 次のような簡単なテストツールを使ってテルネット問題解決には良い選択ですが、telnetここでは使えません。このプログラムは(通常)TLS暗号化を認識しません。私は付属のユーティリティを使うのが好きです。オープンSSLその代わり:

openssl s_client -connect hostname:25 -starttls smtp

STARTTLS(はい、接続パラメータを人間が読める形式で表示したり、スペルを自動入力したりすることもできます)

関連情報