SMTP с STARTTLS работает неправильно (postfix)

SMTP с STARTTLS работает неправильно (postfix)

Когда я используюPHPMailerДля отправки почты через 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

Когда я использую эту конфигурацию и запускаюPHPMailer, он говорит, что соединение не удалось, сразу после выполнения STARTTLSкоманды. МойPHPMailerКонфигурация - это

$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.

Я обнаружил, что использование этого позволяет мне отправлять почту с помощьюPHPMailer:

$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 содержит значение константной переменной (строка "tls") — используйте имя ( PHPMailer::ENCRYPTION_STARTTLS), поскольку само значение не объясняет его значения без изучения документации.

Отелнет: Использование простого инструмента тестирования, напримертелнетхороший выбор для выяснения проблем - но вы не можете использовать telnetздесь - эта программа (обычно) не знает о шифровании TLS. Мне нравится использовать утилиту, включенную вopensslвместо:

openssl s_client -connect hostname:25 -starttls smtp

(да, он даже может продиктовать STARTTLSвам и отобразить параметры соединения в более-менее понятной для человека форме)

Связанный контент