Можно ли указать TLS v1.3 только в phpmailer? - PullRequest
0 голосов
/ 03 августа 2020

Можно ли указать версию протокола шифрования, используемую в PHPMailer?

Попытка создать небольшой веб-инструмент для тестирования конфигураций SMTP. Раньше я мог указывать версию протокола в. NET, но теперь, когда я использую apache, я пытаюсь сделать это на странице PHP с помощью phpmailer. Поэтому мне нужно, чтобы он попробовал ТОЛЬКО одну версию шифрования, такую ​​как TLS 1.3.

Я знаю, что могу установить для smtpautoTLS значение FALSE. Но могу ли я указать TLS 1.3 или SSL v3 в чем-то вроде массива SMTPOptions? Мне не удалось найти это в документации / examples / google.

Спасибо!

Отредактируйте обновленный код и подтвердите, что этот код работает только для SMTPS / неявного стиля , но НЕ STARTTLS

<?php
    require_once 'PHPMailer/vendor/autoload.php';
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    $from = $_POST['from'];
    $to = $_POST['to'];
    $subj = $_POST['subj'];
    $body = $_POST['body'];
    $server = $_POST['addr'];
    $port = $_POST['port'];
    $auth = $_POST['auth'];
    $enctype = $_POST['enctype'];
    $encver = $_POST['encver'];
    $authuser = $_POST['authuser'];
    $authpw = $_POST['authpw'];
    
    $mail = new PHPMailer(true);
    $mail->IsSMTP();
    //$mail->SMTPDebug = 2; //2 for debugging with server responses. 0-4 as choices
    
    $smtpopts = array();
    
    if($encver == "auto")
    {
        $mail->SMTPAutoTLS = true;
    }
    else
    {
        $mail->SMTPAutoTLS = false;
    }
    
    if($auth == 1)
    {
        $mail->SMTPAuth = true;
        $mail->Username = $authuser;
        $mail->Password = $authpw;
        
        switch($enctype)
        {
            case "implicit":
                $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
                break;
            case "explicit":
                $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
                break;
        }
        
        switch($encver)
        {
            case "ssl3_0":
                $smtpopts['ssl'] = array('crypto_method'  => STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
                break;
            
            case "tls1_0":
                $smtpopts['ssl'] = array('crypto_method'  => STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT);
                break;
            
            case "tls1_1":
                $smtpopts['ssl'] = array('crypto_method'  => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT);
                break;
                
            case "tls1_2":
                $smtpopts['ssl'] = array('crypto_method'  => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
                break;
            
            case "tls1_3":
                $smtpopts['ssl'] = array('crypto_method'  => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT);
                break;
        }
    
        $mail->SMTPOptions = $smtpopts;
    }
    else
    {
        $mail->SMTPAuth = false;
    }
    
    $mail->Host = $server;
    $mail->Port = $port;
    
    $mail->SetFrom($from);
    $mail->AddAddress($to);
    $mail->Subject = $subj;
    $mail->MsgHTML($body);
    
    $response = array();
    
    try
    {
        header('Content-Type: application/json');
        $mail->Send();
        $response['success'] = 1;
        $response['msg'] = "Success";
        echo json_encode($response);
    }
    catch (Exception $e)
    {
        $response['success'] = 0;
        $response['msg'] = $e->errorMessage();
        error_log($e->errorMessage());
        echo json_encode($response);
    }
    catch (\Exception $e)
    {
        $response['success'] = -99;
        $response['msg'] = $e->getMessage();
        error_log($e->getMessage());
        echo json_encode($response);
    }
?>

1 Ответ

0 голосов
/ 03 августа 2020

Критическая константа для поддержки TLSv1.3 - STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT, которая была введена в PHP 7.4.0 , но, похоже, недокументирована.

PHPMailer использует константу TLS STREAM_CRYPTO_METHOD_TLS_CLIENT в классе SMTP, когда шифрование инициализируется через STARTTLS . Эта константа объединяет TLS 1.0, 1.1, 1.2 и 1.3, как вы можете видеть в PHP источнике .

Итак, для вашей конкретной ситуации вы хотите заменить STREAM_CRYPTO_METHOD_TLS_CLIENT по умолчанию для STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT. Вы можете добиться того, о чем просите (по крайней мере, для целей тестирования), создав подкласс SMTP-класса и переопределив метод startTLS, чтобы вы могли контролировать константу TLS.

Однако этот подход будет работать только для SMTP + STARTTLS, а не SMTPS. Для SMTPS (режим ssl в PHPMailer) вы можете использовать другой подход, который может работать для обоих. Глядя на , этот тестовый пример показывает, что вы можете указать константу типа соединения в параметрах, переданных в stream_context_create - и это тот самый массив, к которому PHPMailer предоставляет вам доступ, поэтому попробуйте следующее:

$mail->SMTPOptions = [
    'ssl' => ['crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT]
];
...