в nginx

Пересборка Nginx с поддержкой TLS v1.3

nginx
В рамках этой статьи исключительно из «спортивного интереса» рассмотрим процесс пересборки Nginx с поддержкой TLS v1.3 — данная возможность уже существует, хотя сам стандарт TLSv1.3 пока находится в драфте. Давайте разберемся!

Еще в апреле 2017 года вышла версия популярного веб-сервера Nginx (1.13.0), которая поддерживает новый стандарт OpenSSL. Сначала я просто попытался прописать в конфигурационном файле с настройками ssl строку:

ssl_protocols TLSv1.3 TLSv1.2;

и перечитать конфиг nginx — ошибок в консоли не появилось, но при проверке сайта на ssllabs по прежнему выводилось сообщение, что TLSv1.3 не поддерживается.

На том же ssllabs любезно указано, что для проверки работы нового стандарта используется черновик 18-й версии TLSv1.3 — похоже, без пересборки не обойтись!

Скачиваем и распаковываем исходники версии Nginx не ниже 1.13.0 (на момент написания статьи актуальная версия 1.13.8):

cd /opt \
&& wget http://nginx.org/download/nginx-1.13.8.tar.gz \
&& tar xf nginx-1.13.8.tar.gz \
&& rm nginx-1.13.8.tar.gz

Скачиваем и распаковываем исходники openssl 1.1.1 tls1.3 draft 18:

wget https://github.com/openssl/openssl/archive/tls1.3-draft-18.zip \
&& unzip tls1.3-draft-18.zip -d tls1.3-draft-18 \
&& rm tls1.3-draft-18.zip

Получаем код модуля ngx_brotli (подробнее о данном модуле можно почитать здесь):

git clone https://github.com/google/ngx_brotli.git \
&& cd /opt/ngx_brotli \
&& git submodule update --init \
&& cd /opt

Скачиваем код модуля ngx_cache_purge (подробности здесь):

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz \
&& tar -zxvf ngx_cache_purge-2.3.tar.gz \
&& mv ngx_cache_purge-2.3 ngx_cache_purge \
&& rm ngx_cache_purge-2.3.tar.gz

Приступаем к сборке Nginx с поддержкой TLS v1.3:

cd /opt/nginx-1.13.8
./configure \
    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --modules-path=/usr/lib/nginx/modules \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_stub_status_module \
    --with-http_auth_request_module \
    --with-http_slice_module \
    --with-threads \
    --with-stream \
    --with-stream_ssl_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-file-aio \
    --with-http_v2_module \
    --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' \
    --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' \
    --with-openssl=/opt/tls1.3-draft-18/openssl-tls1.3-draft-18 \
    --with-openssl-opt='enable-tls1_3' \
    --add-module=/opt/ngx_brotli \
    --add-module=/opt/ngx_cache_purge

Примечание. На этапе конфигурирования могут появиться ошибки (возможно, будет не хватать каких-то библиотек), в основном лечатся обычным гуглением.

make && make install
service nginx restart

Теперь можем внести правки в конфигурационный файл ssl.conf (у меня это отдельный файл, который включается в контексте server с помощью директивы include) — добавляем в переменную ssl_protocols значение TLSv1.3 и добавляем новые шифры в переменную ssl_ciphers:

ssl_protocols TLSv1.3 TLSv1.2;
...
ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256;

В моем случае файл целиком выглядит так:

ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:EECDH+AES128:EECDH+AES256:EECDH+3DES:RSA+3DES:!MD5;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;

ssl_certificate /etc/letsencrypt/live/letsclearitup.com.ua/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/letsclearitup.com.ua/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/letsclearitup.com.ua/chain.pem;

add_header Strict-Transport-Security max-age=15768000;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Xss-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "origin-when-cross-origin";
add_header Content-Security-Policy "default-src 'self'; script-src https: 'self' 'unsafe-inline' 'unsafe-eval'; object-src *.googlesyndication.com 'self'; style-src https://fonts.googleapis.com *.wp.com 'self' 'unsafe-inline'; connect-src https: 'self'; frame-src https:; font-src https: data:; img-src data: *;";

resolver 8.8.8.8 valid=300s;
resolver_timeout 10s;

Применяем изменения:

nginx -t && nginx -s reload

Проверяем сайт на ssllabs — теперь вы должны увидеть сообщение о включенной поддержке TLS v1.3.

Добавить комментарий