Как активировать TLS 1.3 в Nginx на Ubuntu 18.04 и 16.04

В августе 2018 года IETF представил TLS 1.3 (RFC 8446), что сделало HTTPS более быстрым и безопасным. Эта версия протокола является последней на сегодняшний день. В данном руководстве мы объясним, как активировать TLS 1.3 на веб-сервере Nginx для Ubuntu 18.04 и Ubuntu 16.04.

Обновление: Теперь доступен более удобный метод активации TLS 1.3. Ознакомьтесь с данной статьей: Как быстро активировать TLS 1.3 в Nginx на Ubuntu 18.10, 18.04, 16.04, 14.04.

TLS 1.3: Повышение безопасности и эффективности.

С точки зрения эффективности, для установления HTTPS-соединения TLS 1.2 нуждается в двух круговых обменах, в то время как TLS 1.3 требует лишь одного. Кроме того, TLS 1.3 предлагает режим нулевого кругового обмена (0-RTT), который позволяет клиентам, уже подключавшимся к вашему сайту, отправлять HTTP-запрос в первом сообщении к серверу. Это значительно улучшает опыт пользователей в мобильных сетях и тех, кто находится в отдалённых районах.

С точки зрения безопасности, TLS 1.3 исключил поддержку устаревших шифров, которые способствовали уязвимостям, таким как атака ROBOT. Это означает, что администраторы серверов не могут интегрировать старые шифры в TLS 1.3, чтобы удовлетворить пользователей устаревших веб-браузеров. Хотя это описание является упрощенным, у CloudFlare есть отличное и подробное объяснение TLS 1.3.

Настройка TLS 1.3 в Nginx на Ubuntu 18.04 и 16.04.

Для активации TLS 1.3 в Nginx необходимо соблюдение двух условий.

  1. Для поддержки TLS 1.3 ваша версия Nginx должна быть не ниже 1.13.
  2. Nginx необходимо компилировать с OpenSSL версии 1.1.1 или выше, либо использовать в связке с OpenSSL 1.1.1 и новее.

Второе условие может показаться сложным для понимания, поэтому я приведу два примера.

  • Ubuntu 18.04 включает в себя OpenSSL версии 1.1.0. Замена системной библиотеки OpenSSL не рекомендуется, однако вы можете загрузить исходный код OpenSSL 1.1.1 и скомпилировать Nginx с этой версией, чтобы добавить поддержку TLS 1.3.
  • В настоящее время Arch Linux включает OpenSSL версии 1.1.1, однако пакет Nginx в репозитории Arch собран на основе OpenSSL 1.1.0. Таким образом, Nginx не использует OpenSSL 1.1.1 при сборке, но вполне совместим с этой версией.
Читайте также:  Решена проблема «bash: scp: команда не найдена» в Linux

Теперь рассмотрим процесс компиляции Nginx с OpenSSL 1.1.1 на системах Ubuntu 18.04 и 16.04.

  • Интеграция официального репозитория Nginx.
  • Я планирую добавить официальный репозиторий Nginx на свой сервер Ubuntu вместо загрузки исходного архива и компиляции его с помощью make. Затем я создам deb-пакет из исходного кода, что избавит меня от необходимости вручную вводить длинный список параметров конфигурации для команды configure. Кроме того, в deb-пакете будет удобный файл службы systemd.

    Сначала получите GPG-ключ для Nginx и импортируйте его в систему Ubuntu.

    wget http://nginx. org/keys/nginx_signing. key sudo apt-key add nginx_signing. key

    После этого сформируйте файл со списком источников для репозитория Nginx.

    sudo nano /etc/apt/sources. list. d/nginx. list

    В файл нужно добавить две строки. Строка deb-src даст возможность загружать исходные пакеты Nginx через команду apt source. Bionic является кодовым именем для версии Ubuntu 18.04. Если у вас установлена Ubuntu 16.04, замените его на xenial. Обратите внимание, что этот репозиторий не поддерживает 32-битные операционные системы.

    deb [arch=amd64] http://nginx. org/packages/mainline/ubuntu/ bionic nginx deb-src http://nginx. org/packages/mainline/ubuntu/ bionic nginx

    Для сохранения файла в текстовом редакторе Nano используйте комбинацию клавиш Ctrl+O, после чего нажмите Enter для подтверждения. Чтобы закрыть редактор, нажмите Ctrl+X. Далее обновите локальный индекс пакетов.

    sudo apt update

    Официальный репозиторий Nginx теперь интегрирован на сервере Ubuntu.

  • Скачивание исходников Nginx и OpenSSL
  • Создадим папку nginx в /usr/local/src/ для хранения исходных файлов Nginx и затем переместимся в эту папку.

    sudo mkdir /usr/local/src/nginx cd /usr/local/src/nginx/

    Скачайте исходный пакет Nginx, используя следующую команду:

    Пожалуйста, просмотрите загруженные документы.

    nginx-1.15.3 nginx_1.15.3-1~bionic. dsc для nginx версии 1.15.3-1~bionic. debian. tar. xz nginx_1.15.3.orig. tar.gz

    После этого скопируйте репозиторий OpenSSL с GitHub.

    cd /usr/local/src sudo apt install git sudo git clone https://github.com/openssl/openssl. git cd openssl

    Перечислите все доступные ветки и переключитесь на стабильную версию 1.1.1.

    Читайте также:  Как установить стандартную версию Nginx на сервер Ubuntu

    git branch - a sudo git checkout OpenSSL_1_1_1-stable

  • Настройте параметры компиляции Nginx.
  • Измените файл с правилами компиляции для Nginx.

    sudo nano /usr/local/src/nginx/nginx-1.15.3/debian/rules

    Перейдите в раздел config.status. nginx: config.env. nginx. В конце строки CFLAGS добавьте указанный текст, помня, что он не должен быть на новой строке.

    --with-openssl=/usr/local/src/openssl

    Установка TLS 1.3 на Nginx в Ubuntu 18.04.

    Сохраните изменения и завершите работу с файлом.

  • Сборка Nginx
  • Проверьте, что вы находитесь в папке с исходниками Nginx.

    cd /usr/local/src/nginx/nginx-1.15.3/

    Скачайте необходимые библиотеки для компиляции нашего deb-пакета Nginx.

    sudo apt build-dep nginx

    Теперь применяйте следующую команду для создания deb-пакета.

    sudo dpkg-buildpackage - b

    Если вам встретится следующая ошибка,

    Не предусмотрен инициализатор для свойства ‘md_ctrl’ в ‘EVP_MD’.

    После этого внесите изменения в файл auto/cc/gcc.

    sudo nano /usr/local/src/nginx/nginx-1.15.3/auto/cc/gcc

    Закомментируйте следующую строку. Параметр — Werror заставляет компилятор GCC воспринимать предупреждения как ошибки.

    CFLAGS="$CFLAGS - Werror"

    После этого повторно выполните команду сборки. Когда процесс завершится, в папке /usr/local/src/nginx/ появится deb-пакет Nginx. Если у вас уже была установлена предыдущая версия, следует её удалить и установить обновлённую.

    sudo apt remove nginx nginx-common nginx-full cd /usr/local/src/nginx/ sudo dpkg - i nginx_1.15.3-1~bionic_amd64.deb

    Давайте теперь приступим к запуску Nginx.

    sudo systemctl start nginx

    Если вам встретится такое сообщение об ошибке.

    Не удалось запустить nginx.service: Единица nginx.service заблокирована.

    После этого разблокируйте nginx и повторно запустите команду.

    sudo systemctl unmask nginx

    Процесс Nginx может выполняться от имени пользователя nginx или www-data. Это можно настроить, изменив первую строку в конфигурационном файле /etc/nginx/nginx.conf.Важно убедиться, что Nginx работает под тем же пользователем, что и PHP-FPM.

    Теперь убедитесь в правильности параметров конфигурации Nginx.

    sudo nginx - V

    Как можно заметить, у нас установлена последняя версия Nginx, собранная с использованием OpenSSL 1.1.1.

    Включение протокола TLS 1.3 в настройках сервера Nginx.

    Предположим, что вы уже активировали HTTPS для вашего Nginx-сервера. Для включения TLS 1.3 синтаксис достаточно простой. Откройте конфигурационный файл сервера Nginx, который находится в директории /etc/nginx/conf.d/ или /etc/nginx/sites-enabled/, и найдите нужную строку.

    Читайте также:  Как добавить или удалить префикс WWW в URL домена

    ssl_protocols TLSv1.2;

    Включите протокол TLSv1.3 в перечень поддерживаемых.

    ssl_protocols TLSv1.2 TLSv1.3;

    Далее добавьте три новых набора шифров к уже имеющимся.

    TLS-CHACHA20-POLY1305-SHA256 TLS-AES-256-GCM-SHA384 TLS-AES-128-GCM-SHA256

    ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

    Сохраните файл и закройте его. После этого проверьте настройки Nginx и выполните перезагрузку.

    sudo nginx - t sudo systemctl reload nginx

    Скорее всего, Ubuntu 18.04 не перейдет на OpenSSL 1.1.1, и в результате, если вы выполните обновление Nginx с помощью команды sudo apt upgrade, поддержка TLS 1.3 будет удалена. Рекомендуется заблокировать обновление Nginx через apt, используя следующую команду:

    sudo apt-mark hold nginx

    С обновлением Nginx 1.15.4 появилась возможность активировать 0-RTT с OpenSSL, для этого необходимо добавить соответствующую директиву в ssl-контекст сервера. По умолчанию данная опция выключена. В версии 1.15.3 это было доступно исключительно с BoringSSL.

    ssl_early_data on

    Активирование TLS 1.3 в браузере Google Chrome

    На данный момент браузеры Firefox 62 и Chrome 69 поддерживают лишь проектную версию 28 TLS 1.3. Окончательная версия TLS 1.3 доступна в OpenSSL 1.1.1. Реализации, основанные на проектной версии, не совместимы с финальной версией RFC.

    Для проверки нашего сервера Nginx необходимо установить бета-версию Google Chrome и активировать финальную версию TLS 1.3. После установки бета-версии откройте адрес chrome://flags/#tls13-variant в строке браузера и измените параметр с «по умолчанию» на «Включено (Финальная)». После этого перезапустите Google Chrome, чтобы изменения начали действовать.

    активировать tls 1.3 в браузере chrome

    Теперь зайдите на ваш сайт, поддерживающий TLS 1.3 в бета-версии Google Chrome, и нажмите Ctrl+Shift+I для открытия панели инструментов разработчика. Перейдите на вкладку «Безопасность», чтобы узнать, какая версия TLS используется.

    включите tls 1.3 в nginx

    Существует информация, что окончательная версия TLS 1.3 будет внедрена в Firefox 63, который ожидается в октябре 2018 года. В свою очередь, Chrome 70 также планирует добавить эту версию для исходящих соединений.

    Обновление: В Chrome 70 появилась поддержка окончательной версии TLS 1.3, однако по умолчанию все еще применяется черновик 28 TLS 1.3.

    Активируйте TLS 1.3 с помощью CloudFlare.

    Если вы пользуетесь CDN от CloudFlare, значит, ваш сайт уже работает с TLS 1.3. Для проверки этого откройте панель управления CloudFlare и перейдите в раздел криптографии, где вы найдете возможность активации или деактивации TLS 1.3. Кроме того, вы можете активировать 0-RTT. CloudFlare поддерживает как черновую версию 28, так и окончательную.

    На этом всё! Надеюсь, что данный урок оказался полезным для активации TLS 1.3 в Nginx на Ubuntu 18.04 и 16.04. Заботьтесь о себе.