![]() | ||
Настройка HTTPS-серверов | english русский 简体中文 עברית 日本語 türkçe новости [en] об nginx скачать безопасность [en] pgp ключи [en] документация faq ссылки [en] книги [en] поддержка пожертвования [en] trac wiki nginx.com | |
Чтобы настроить HTTPS-сервер, необходимо включить параметр
Сертификат сервера является публичным. Он посылается каждому клиенту, соединяющемуся с сервером. Секретный ключ следует хранить в файле с ограниченным доступом (права доступа должны позволять основному процессу nginx читать этот файл). Секретный ключ можно также хранить в одном файле с сертификатом: при этом права доступа к файлу следует также ограничить. Несмотря на то, что и сертификат, и ключ хранятся в одном файле, клиенту посылается только сертификат.
С помощью директив ssl_protocols и
ssl_ciphers
можно ограничить соединения
использованием только “сильных” версий и шифров SSL/TLS.
Начиная с версии 1.0.5 nginx по умолчанию использует
“ Известно, что шифры с CBC-режимом уязвимы к ряду атак, в частности к BEAST-атаке (см. CVE-2011-3389). Настройка шифров может быть изменена так, чтобы предпочитался RC4-SHA:
Оптимизация HTTPS-сервераSSL-операции потребляют дополнительные ресурсы процессора. На мультипроцессорных системах следует запускать несколько рабочих процессов, не меньше числа доступных процессорных ядер. Наиболее ресурсоёмкой для процессора является операция SSL handshake, в рамках которой формируются криптографические параметры сессии. Существует два способа уменьшения числа этих операций, производимых для каждого клиента: использование постоянных (keepalive) соединений, позволяющих в рамках одного соединения обрабатывать сразу несколько запросов, и повторное использование параметров SSL-сессии для предотвращения необходимости выполнения SSL handshake для параллельных и последующих соединений. Сессии хранятся в кэше SSL-сессий, разделяемом между рабочими процессами и настраиваемом директивой ssl_session_cache. В 1 мегабайт кэша помещается около 4000 сессий. Таймаут кэша по умолчанию равен 5 минутам. Он может быть увеличен с помощью директивы ssl_session_timeout. Вот пример конфигурации, оптимизированной под 4-ядерную систему с 10-мегабайтным разделяемым кэшем сессий:
Цепочки SSL-сертификатовНекоторые браузеры могут выдавать предупреждение о сертификате, подписанном общеизвестным центром сертификации, в то время как другие браузеры без проблем принимают этот же сертификат. Так происходит потому, что центр, выдавший сертификат, подписал его промежуточным сертификатом, которого нет в базе данных сертификатов общеизвестных доверенных центров сертификации, распространяемой вместе с браузером. В подобном случае центр сертификации предоставляет “связку” сертификатов, которую следует присоединить к сертификату сервера. Сертификат сервера следует разместить перед связкой сертификатов в скомбинированном файле: $ cat www.example.com.crt bundle.crt > www.example.com.chained.crt Полученный файл следует указать в директиве ssl_certificate: Если сертификат сервера и связка сертификатов были соединены в неправильном порядке, nginx откажется запускаться и выдаст сообщение об ошибке: поскольку nginx попытается использовать секретный ключ с первым сертификатом из связки вместо сертификата сервера.
Браузеры обычно сохраняют полученные промежуточные сертификаты, подписанные
доверенными центрами сертификации, поэтому активно используемые браузеры
уже могут иметь требуемые промежуточные сертификаты и не выдать предупреждение
о сертификате, присланном без связанной с ним цепочки сертификатов.
Убедиться в том, что сервер присылает полную цепочку сертификатов,
можно при помощи утилиты командной строки
В этом примере субъект (“s”) сертификата №0 сервера
Если связку сертификатов не добавили, будет показан только сертификат сервера №0. Единый HTTP/HTTPS серверМожно настроить единый сервер, который обслуживает как HTTP-, так и HTTPS-запросы:
До версии 0.7.14 SSL нельзя было включить выборочно для
отдельных слущающих сокетов, как показано выше.
SSL можно было включить только для всего сервера целиком,
с помощью директивы ssl,
что не позволяло настроить единый HTTP/HTTPS сервер.
Для решения этой задачи был добавлен
параметр
Выбор HTTPS-сервера по имениТипичная проблема возникает при настройке двух и более серверов HTTPS, слушающих на одном и том же IP-адресе:
В такой конфигурации браузер получит сертификат сервера по умолчанию, т.е.
Наиболее старым и надёжным способом решения этой проблемы является назначение каждому HTTPS-серверу своего IP-адреса:
SSL-сертификат с несколькими именами
Существуют и другие способы, которые позволяют использовать один и тот же
IP-адрес сразу для нескольких HTTPS-серверов.
Все они, однако, имеют свои недостатки.
Одним из таких способов является использование сертификата с несколькими
именами в поле SubjectAltName сертификата, например
Другим способом является использование wildcard-сертификата, например
Лучше поместить сведения о файле сертификата с несколькими именами и файле с его секретным ключом на уровне конфигурации http, чтобы все серверы унаследовали их единственную копию в памяти:
Указание имени сервераБолее общее решение для работы нескольких HTTPS-серверов на одном IP-адресе — расширение Server Name Indication протокола TLS (SNI, RFC 6066), которое позволяет браузеру передать запрашиваемое имя сервера во время SSL handshake, а значит сервер будет знать, какой сертификат ему следует использовать для соединения. Однако, поддержка SNI браузерами ограничена. Сейчас это поддерживается браузерами начиная со следующих версий:
В SNI можно передавать только доменные имена, однако некоторые браузеры могут ошибочно передавать IP-адрес сервера в качестве его имени, если в запросе указан IP-адрес. Полагаться на это не следует.
Чтобы использовать SNI в nginx, соответствующая поддержка должна
присутствовать как в библиотеке OpenSSL, использованной при сборке
бинарного файла nginx, так и в библиотеке, подгружаемой в момент работы.
OpenSSL поддерживает SNI начиная с версии 0.9.8f, если она была
собрана с опцией конфигурации $ nginx -V ... TLS SNI support enabled ... Однако, если nginx, собранный с поддержкой SNI, в процессе работы подгружает библиотеку OpenSSL, в которой нет поддержки SNI, nginx выдаёт предупреждение: nginx was built with SNI support, however, now it is linked dynamically to an OpenSSL library which has no tlsext support, therefore SNI is not available
Совместимость
|