Thank you for reading this post, don't forget to subscribe!
рассмотрим процесс пересборки Nginx с поддержкой TLS v1.3 - данная возможность уже существует, хотя сам стандарт TLSv1.3 пока находится в драфте
Еще в апреле 2017 года вышла версия популярного веб-сервера Nginx (1.13.0), которая поддерживает новый стандарт OpenSSL. Сначала я просто попытался прописать в конфигурационном файле с настройками ssl строку:
1 2 |
ssl_protocols TLSv1.3 TLSv1.2; |
и перечитать конфиг nginx - ошибок в консоли не появилось, но при проверке сайта на ssllabs по прежнему выводилось сообщение, что TLSv1.3 не поддерживается.
На том же ssllabs любезно указано, что для проверки работы нового стандарта используется черновик 18-й версии TLSv1.3 - похоже, без пересборки не обойтись!
Скачиваем и распаковываем исходники версии Nginx не ниже 1.13.0 (на момент написания статьи актуальная версия 1.13.8):
1 2 3 4 5 |
<span class="hljs-built_in">cd</span> /opt \ && wget <a class="vglnk" href="http://nginx.org/download/nginx-1.13.8.tar.gz" rel="nofollow">http://nginx.org/download/nginx-1.13.8.tar.gz</a> \ && tar xf nginx-1.13.8.tar.gz \ && rm nginx-1.13.8.tar.gz |
Скачиваем и распаковываем исходники openssl 1.1.1 tls1.3 draft 18
:
1 2 3 4 |
wget <a class="vglnk" href="https://github.com/openssl/openssl/archive/tls1.3-draft-18.zip" rel="nofollow">https://github.com/openssl/openssl/archive/tls1.3-draft-18.zip</a> \ && unzip tls1.3-draft-18.zip <span class="hljs-_">-d</span> tls1.3-draft-18 \ && rm tls1.3-draft-18.zip |
Получаем код модуля ngx_brotli
(подробнее о данном модуле можно почитать здесь):
1 2 3 4 5 |
git <span class="hljs-built_in">clone</span> <a class="vglnk" href="https://github.com/google/ngx_brotli.git" rel="nofollow">https://github.com/google/ngx_brotli.git</a> \ && <span class="hljs-built_in">cd</span> /opt/ngx_brotli \ && git submodule update --init \ && <span class="hljs-built_in">cd</span> /opt |
Скачиваем код модуля ngx_cache_purge
(подробности здесь):
1 2 3 4 5 |
wget <a class="vglnk" href="http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz" rel="nofollow">http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz</a> \ && 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:
1 2 |
<span class="hljs-built_in">cd</span> /opt/nginx-1.13.8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
./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/<span class="hljs-built_in">log</span>/nginx/error.log \ --http-log-path=/var/<span class="hljs-built_in">log</span>/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=<span class="hljs-string">'-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2'</span> \ --with-ld-opt=<span class="hljs-string">'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed'</span> \ --with-openssl=/opt/tls1.3-draft-18/openssl-tls1.3-draft-18 \ --with-openssl-opt=<span class="hljs-string">'enable-tls1_3'</span> \ --add-module=/opt/ngx_brotli \ --add-module=/opt/ngx_cache_purge |
Примечание. На этапе конфигурирования могут появиться ошибки (возможно, будет не хватать каких-то библиотек), в основном лечатся обычным гуглением.
1 2 |
make && make install |
1 2 |
service nginx restart |
Теперь можем внести правки в конфигурационный файл ssl.conf
(у меня это отдельный файл, который включается в контексте server
с помощью директивы include
) - добавляем в переменную ssl_protocols
значение TLSv1.3 и добавляем новые шифры в переменную ssl_ciphers
:
1 2 3 4 |
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; |
В моем случае файл целиком выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 *.<a class="vglnk" href="http://googlesyndication.com/" rel="nofollow">googlesyndication.com</a> 'self'; style-src <a class="vglnk" href="https://fonts.googleapis.com/" rel="nofollow">https://fonts.googleapis.com</a> *.<a class="vglnk" href="http://wp.com/" rel="nofollow">wp.com</a> '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; |
Применяем изменения:
1 2 |
nginx -t && nginx <span class="hljs-_">-s</span> reload |
Проверяем сайт на ssllabs - теперь вы должны увидеть сообщение о включенной поддержке TLS v1.3.