Включаем в Nginx поддержку HTTP/3, TLSv1.3, HSTS, OCSP и получаем в ssllab класс А+
Будут использоваться:
- Debian: v13.1 (Trixie);
- Nginx: v1.26.3;
Полезные ссылки:
Tests:
Configs:
Nginx - Modules:
Настраиваем nginx.conf:
# nano /etc/nginx/nginx.conf
http {
# Разрешает указанные протоколы;
ssl_protocols TLSv1.2 TLSv1.3;
# Указывает, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские;
ssl_prefer_server_ciphers on; # add on for Intermediate;
# Наборы шифров (TLS 1.3 порядок шифров фиксирован в самом протоколе);
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
# Задаёт кривую для ECDHE-шифров;
ssl_ecdh_curve X25519:prime256v1:secp384r1;
# Тип и объём кэша для хранения параметров сессий. Параметр shared задает общий для всех рабочих процессов nginx кэш;
ssl_session_cache shared:SSL:3m;
# Задаёт время, в течение которого клиент может повторно использовать параметры сессии;
ssl_session_timeout 12h;
# Разрешает или запрещает возобновление сессий при помощи TLS session tickets;
ssl_session_tickets off;
# Разрешает или запрещает прикрепление OCSP-ответов сервером;
#ssl_stapling on;
# Разрешает или запрещает проверку сервером ответов OCSP;
#ssl_stapling_verify on;
# Для преобразования имени хоста OCSP responder’а в адрес;
#resolver 172.16.5.57 valid=300s;
#resolver_timeout 5s;
}
Настройка sites-available/xnet.icu:
# nano /etc/nginx/sites-available/xnet.icu
server {
listen 80;
server_name xnet.icu;
#return 301 https://$host$request_uri;
return 301 https://xnet.icu$request_uri;
}
server {
listen 443 ssl;
listen 443 quic reuseport;
http2 on;
http3 on;
quic_gso on; # Включить Generic Segmentation Offload для QUIC (ускоряет передачу);
quic_retry on; # Включить повторные попытки QUIC соединений при потере пакетов;
ssl_early_data on; # Включить 0-RTT соединения TLS для ускорения HTTPS;
server_name xnet.icu;
# HTTP/3 (QUIC) - Объявляем поддержку протокола;
add_header Alt-Svc 'h3=":443"; ma=86400' always;
# Основная защита соединения;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Базовые меры безопасности;
add_header X-Frame-Options "DENY" always; # Защита от Clickjacking;
add_header X-Content-Type-Options "nosniff" always; # Защита от MIME-sniffing;
add_header Referrer-Policy "strict-origin-when-cross-origin" always; # Минимизирует передачу Referer;
add_header X-XSS-Protection "1; mode=block" always; # (Устарело, но можно оставить для IE);
add_header X-Permitted-Cross-Domain-Policies "none" always; # Блокирует Flash / Adobe crossdomain.xml;
# Изоляция и политика разрешений;
add_header Cross-Origin-Opener-Policy "same-origin" always; # Изоляция вкладки (COOP);
add_header Cross-Origin-Embedder-Policy "require-corp" always; # Изоляция ресурсов (COEP);
add_header Cross-Origin-Resource-Policy "same-origin" always; # Разрешает загрузку ресурсов только со своего домена;
add_header Permissions-Policy "camera=(),microphone=(),geolocation=(),payment=(),usb=(),magnetometer=(),gyroscope=(),fullscreen=(self)" always; # Отключает доступ к чувствительным API;
# CSP - Content Security Policy;
add_header Content-Security-Policy "default-src 'self' xnet.icu; script-src 'self' 'unsafe-inline' cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' cdn.jsdelivr.net; img-src 'self'; font-src 'self'; connect-src 'self'; media-src 'self'; frame-ancestors 'none'; object-src 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests;" always;
ssl_certificate /etc/letsencrypt/live/xnet.icu/fullchain.pem; # path to fullchain.pem | .crt;
ssl_certificate_key /etc/letsencrypt/live/xnet.icu/privkey.pem; # path to privkey.pem | .key;
#ssl_trusted_certificate /etc/letsencrypt/live/xnet.icu/chain.pem; # Если включён ssl_stapling;
ssl_dhparam /etc/ssl/nginx/dhparam.pem; # | else <= TLS 1.3;
.....
Создаем самоподписанные SSL сертификаты: или получаем от Let's Encrypt.
# mkdir /etc/ssl/nginx
# openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout /etc/ssl/nginx/iqadm.ru.key -out /etc/ssl/nginx/iqadm.ru.crt
-х509 означает, что мы хотим создать самоподписанный сертификат
-nodes означает, что мы не будем защищать сертификат паролем (если сделать это, то пароль придётся вводить при каждом старте)
-days 3650 означает, что сертификат будет действителен (почти) 10 лет
-newkey rsa:2048 создаст ключ длиной 2048 бит
-keyout и -out — названия наших ключа и сертификата
Генерируем ключ Диффи-Хеллмана:
# openssl dhparam -out /etc/ssl/nginx/dhparam.pem 2048 или 4096
Ссылки для чтения:
| HABR - 1 - 2 - 3 - 4 - 5 | OpenSSL, ssl_ciphers и nginx: прокачиваем на 100% |