Оптимизация TLS в NGINX

TLS (он же Transport Layer Security) — протокол защиты веб-страниц, который заменил собой SSL. По сути TLS = SSL и является следующим поколением (версией) устаревшего и подверженного POODLE-атакам стандарта. TLS/SSL

TLS умеет не только шифровать данные, но также проводить аутентификацию пользователей на сервере и проверять информацию на целостность. Протокол обязателен к использованию коммерческими сайтами и организациями, которые хотят подтвердить свою подлинность. Ну и обеспечения конфиденциальности пользователей.

Для установки безопасного канала используется протокол TLS Handshake, также нужно получить сертификат от ЦС и подгрузить криптобиблиотеку, OpenSSL в нашем случае.

Для включения TLS и настройки HTTPS-сервера в Nginx нужно в файле конфигурации в секцию server включить параметр SSL:

server {
    listen              443 ssl;
    server_name         example.com;
    ssl_certificate     example.com.crt;
    ssl_certificate_key example.com.key;
    ssl_protocols       TLSv1.1 TLSv1.2;
    ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
    ...
}

# включение SSL на 443 порте, указание сертификата, ключа, протоколов TLS и используемых шифров

Здесь директива ssl_protocols ограничивает используемые протоколы, а ssl_ciphers описывает разрешенные шифры в формате, поддерживаемом библиотекой OpenSSL. К примеру:

ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

# пример использования всех шифров в формате OpenSSL

Важно понимать, что операции TLS/SSL достаточно ресурсоемкие, так что даже требуется запуск нескольких рабочих процессов на мультипроцессорных системах. Самой “тяжелой” и в плане нагрузки, и по времени исполнения, является операция TLS Handshake. Поэтому лучшим решением будет оптимизация сессии: постоянные соединения, кэширование, статические ключи и включение OCSP Stapling.

Keepalive

Использование постоянных соединений дает возможность в условиях одного подключения обрабатывать сразу несколько запросов. TLS keepalive

Для этого в секцию server файла конфигурации нужно добавить:


server {

...
keepalive_timeout   70;

…

}

# включение keepalive

Кэширование сессии

Кэширование необходимо для повторного использования ключей, чтобы не повторять хэндшейк. TLS caching

Для этого в секции http файла конфигурации Nginx нужно добавить:


http {
    ssl_session_cache   shared:SSL:100m;
    ssl_session_timeout 1h;
…
}

# включение общего кэша размером 100 МБ и таймаута времени сессии 1 час

В 1 МБ кэша помещается около 4000 сессий, так что представленный пример позволит хранить до 400 000 сессий.

Session Tickets или мандат сессии

Протокол TLS умеет использовать session tickets для возобновления сеанса, при условии, что клиент их поддерживает (браузеры семейства Chromium и Firefox). Для этого TLS-сервер отправляет клиенту состояние сессии (session ticket), шифруя его своим ключом, и идентификатор ключа. Клиент возобновляет защищенную сессию, отправляя последний тикет на сервер во время инициализации процедуры TLS Handshake. А сервер, в свою очередь, возобновляет сессию в соответствии с сохраненными параметрами. TLS session tickets

Реализуется все очень просто. В конфигурацию Nginx в уже знакомой секции server необходимо добавить:


server {

…
ssl_session_ticket_key current.key;
ssl_session_ticket_key prev.key;
ssl_session_ticket_key prevprev.key;

…
}

# включение статических ключей

OCSP Stapling

Online Certificate Status Protocol — механизм проверки актуальности сертификата SSL, который заменил менее быстрый протокол CRL (Certificate Revocation List). При использовании CRL браузер загружает список аннулированных сертификатов и проверяет текущий сертификата, что увеличивает время подключения. Тогда как при использовании OCSP браузер отправляет проверочный запрос на адрес OCSP и в ответ получает статус сертификата, что может сильно нагружать сервера центров сертификации. OCSP Stapling

Для использования протокола применяется OCSP Stapling — владелец сертификата самостоятельно с определенным интервалом опрашивает сервер OCSP и кэширует ответ, который содержит электронную подпись. Сам ответ “сшивается” с TLS Handshake через расширение запроса Certificate Status Request. Так что на серверы центров сертификации не поступает огромное количество запросов, которые также содержат информацию о просмотрах пользователя.

Чтобы включить OCSP Stapling, нужно добавить несколько строчек кода в файл конфигурации Nginx:


server {

…
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/example.com.crtt;
…
}

# включение OCSP Stapling и подключение доверенного сертификата

Дополнительные функции

Для принудительного использования браузером протокола HTTPS существует механизм под названием Strict Transport Security:


add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

# включение Strict-Transport-Security, возраст в секундах

При помощи вот такой функции браузер будет понимать, что нужно использовать протокол HTTPS даже переходя по ссылке HTTP. Это поможет предотвратить часть атак, особенно, если на сервере не установлен редирект с HTTP на HTTPS.

Самое главное

Оптимизация TLS не займет много времени, но поможет существенно ускорить работу протокола и подключения пользователей к защищенным сайтам. А внедрение OCSP Stapling и HSTS еще и повысит безопасность соединения.

Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень